在斯威夫特Down与as?

cfi*_*her 15 cocoa downcast swift

这两个代码片段之间的区别是什么:

let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell?
// vs
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
Run Code Online (Sandbox Code Playgroud)

结果不完全一样吗?

Ant*_*nio 14

在那个代码中没有区别,在两种情况下它的评估结果都是如此 UITableViewCell?

真正的区别是:

  • 在第一种情况下,UITableViewCell?预期的向下转换总是成功(即使它是零),所以如果dequeueReusableCellWithIdentifier返回的东西不是UITableViewCell(或从其继承的类的实例)的实例,它在运行时失败.表达式返回一个可选项UITableViewCell?

  • 在第二种情况下,强制转换是可选的:如果返回的对象dequeueReusableCellWithIdentifier既不UITableViewCell是子类的实例也不是子类的实例,则向下转换优雅地计算为nil(因此没有运行时错误).

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


Kir*_*ins 6

主要区别asas?as被强制投,如果不成功会崩溃.as?如果强制转换成功nil且不成功,将返回包含值的可选值.