【问题标题】:Swift: Downcast to known typeSwift:向下转换为已知类型
【发布时间】:2015-07-14 07:28:56
【问题描述】:

我只是想知道……

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。 “?

我希望得到类似的东西:

movie = item as?

或

movie =? movie

【问题讨论】:

标签: swift optional


【解决方案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"

【讨论】:

  • 这正是我所希望的。我肯定会在我的下一个项目中使用它。
  • 请注意,中缀inout 运算符不能分配给let 常量。
【解决方案2】:
【解决方案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 operator /? {}
postfix func /?<T, U>(val: T?) -> U? {
    return val as? U
}

let movie: Movie?
movie = item/?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多