Swift: Downcast для известного типа
Мне просто интересно...
let movie = item as? Movie
В этом примере item
имеет тип Movie
или что-то еще. В случае последнего Movie
будет присвоено значение nil. Таким образом, Movie
будет иметь тип Movie?
.
Теперь рассмотрим следующий пример:
let movie: Movie?
movie = item as? Movie
Скажем, Movie
- это переменная класса, которую я присваиваю некоторое значение внутри одного из моих методов класса.
Мне кажется, что as? Movie
несколько избыточно, поскольку Movie
уже известен как тип Movie?
.
Есть ли какой-либо синтаксис в Swift, который гласит: "Включение этого объекта в тот же тип, что и объект, к которому я его назначаю. Назначьте nil, если это необязательный тип, а downcast терпит неудачу."
Я надеялся на что-то вроде:
movie = item as?
или
movie =? movie
Ответы
Ответ 1
В существующих ответах правильно указано, что для этого нет встроенных функций. Но только для того, чтобы опираться на то, что уже было написано здесь, можно определить инфиксный оператор =?
, который реализует поведение, описанное в вашем вопросе. Например:
infix operator =? {
associativity none
precedence 130
}
func =? <T>(inout lhs: T?, rhs: Any?) {
lhs = rhs as? T
}
var movie: Movie?
let item: Any? = Movie(name: "some movie")
movie =? item
movie?.name // "some movie"
Ответ 2
Это невозможно.
См. раздел "Тип отливки" приведенной ниже документации:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_514
Ответ 3
Есть ли какой-либо синтаксис в Swift...
НЕТ.
Вы должны сами реализовать
func conditionalCast<T, U>(val: T?) -> U? {
return val as? U
}
// Usage:
class Movie {}
class Image {}
let item:AnyObject = arc4random_uniform(2) == 0 ? Movie() : Image()
let movie: Movie?
movie = conditionalCast(item)
Вы можете сделать его как пользовательский унарный оператор (postfix /?
для exmaple):
postfix operator /? {}
postfix func /?<T, U>(val: T?) -> U? {
return val as? U
}
let movie: Movie?
movie = item/?