【问题标题】:Downcasting in Swift with as and as?在 Swift 中使用 as 和 as 向下转型?
【发布时间】:2014-09-26 10:18:38
【问题描述】:

这两个代码sn-ps有什么区别:

let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell

结果不完全一样吗?

【问题讨论】:

  • as UITableViewCell? 导致 Swift 2 中的编译错误 AnyObject? is not convertible to UITableViewCell?

标签: cocoa swift downcast


【解决方案1】:

在该代码中没有区别,在这两种情况下它的计算结果都是UITableViewCell?

真正的区别是:

    1234563继承自它),它在运行时失败。该表达式返回一个可选的UITableViewCell?
  • 在第二种情况下,强制转换是可选的:如果dequeueReusableCellWithIdentifier 返回的对象既不是UITableViewCell 的实例也不是子类的实例,向下转换优雅地计算为 nil(因此没有运行时错误)。

当然dequeueReusableCellWithIdentifier 总是返回UITableViewCell,这就是你的代码没有区别的原因。但在其他情况下可能存在差异,您必须注意这一点以防止运行时错误

【讨论】:

    【解决方案2】:

    asas? 的主要区别在于as 是强制转换的,如果不成功会崩溃。 as? 将返回包含值的可选值,如果转换成功,nil 如果不成功。

    【讨论】:

    • 这是否意味着asas!是一样的?
    • @BR41N-FCK 这有点改变,在 Swift 2.0 中as 仅在没有失败机会的情况下才有效(如果在不允许的情况下使用它,则会出现编译时错误)。 as! 被称为强制转换,如果在运行时无法进行转换,则会崩溃。
    • 是否对这三者进行比较以更好地掌握它们之间的细微差别?
    • @BR41N-FCK as - 仅在施法不能失败时可用。 as? - 可选类型转换(如果无法进行类型转换,则结果为零),结果是可选类型。 as! - 强制施法,如果施法不可行则崩溃。
    • 如果情况像你刚才描述的那样,as! 的存在还有意义吗?我的意思是,如果演员阵容可能失败并且您可以处理失败并继续进行as? 似乎是要去做的事情,如果您不能允许任何失败并且它必须起作用,那么as 似乎适用。那么为什么要使用as!,尤其是考虑到它会导致运行时错误并激怒用户这一事实。
    【解决方案3】:

    asas? 之间的区别

    • as? UITableViewCell 表示当你不知道自己是什么downcasting 时,你假设为UITableViewCell,但可能是我IntegerFloatArrayDictionary

    • as UITableViewCell? 表示它是一个Optional Value,它可能包含一个UITableViewCellNil 值。

    【讨论】:

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