Swift:向下转换为已知类型
Swift: Downcast to known type
我只是想知道……
let movie = item as? Movie
在此示例中,item
是 Movie
类型或其他类型。如果是后者,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 文档的类型转换部分:
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"
我只是想知道……
let movie = item as? Movie
在此示例中,item
是 Movie
类型或其他类型。如果是后者,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 文档的类型转换部分:
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"