Подтвердить что ты не робот

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
4b9b3361

Ответ 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"

Ответ 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/?