一尘不染

使用as和as在Swift中向下转换?

swift

这两个代码段之间有什么区别:

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

结果不完全一样吗?


阅读 259

收藏
2020-07-07

共1个答案

一尘不染

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

真正的区别是:

  • 在第一种情况下,向下转换UITableViewCell?预期将始终成功(即使它为nil),因此,如果dequeueReusableCellWithIdentifier返回的不是其实例UITableViewCell(或从其继承的类的实例),则它将在运行时失败。该表达式返回一个可选UITableViewCell?

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

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

2020-07-07