Swift:向下转换为已知类型

Swift: Downcast to known type

我只是想知道……

let movie = item as? Movie

在此示例中,itemMovie 类型或其他类型。如果是后者,movie 将被分配一个 nil 值。因此 movie 将是 Movie?.

类型

现在查看下一个示例:

let movie: Movie?

movie = item as? Movie

假设 movie 是一个 class 变量,我在我的 class 方法之一中分配了一些值。

对我来说,感觉 as? Movie 有点多余,因为 movie 已知属于 Movie?.

类型

Swift 中是否有这样的语法:"Downcast this object to the same type as the object to which I'm assigning it to. Assign nil if this is an optional type and the downcast fails."?

我希望是这样的:

movie = item as?

movie =? movie

这是不可能的。

请参阅下面 swift 文档的类型转换部分:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_514

Is there any kind of syntax in 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 operator /? {}
postfix func /?<T, U>(val: T?) -> U? {
    return val as? U
}

let movie: Movie?
movie = item/?

现有答案正确地指出没有内置功能。但是,仅以此处已写的内容为基础,可以定义一个中缀运算符 =? 来实现您在问题中描述的行为。例如:

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"