这两个代码段之间有什么区别:
let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as UITableViewCell? // vs let cell = tableView.dequeueReusableCellWithIdentifier("cellId") as? UITableViewCell
结果不完全一样吗?
在该代码中没有区别,在两种情况下它的求和结果都是 UITableViewCell?
UITableViewCell?
真正的区别是:
在第一种情况下,向下转换UITableViewCell?预期将始终成功(即使它为nil),因此,如果dequeueReusableCellWithIdentifier返回的不是其实例UITableViewCell(或从其继承的类的实例),则它将在运行时失败。该表达式返回一个可选UITableViewCell?
dequeueReusableCellWithIdentifier
UITableViewCell
在第二种情况下,强制类型转换是可选的:如果返回的对象dequeueReusableCellWithIdentifier既不UITableViewCell是子类的实例也不是子类的实例,则向下转换的结果为nil(因此没有运行时错误)。
当然dequeueReusableCellWithIdentifier总是返回a UITableViewCell,这就是为什么代码没有区别的原因。但是在其他情况下,可能存在差异,因此您必须注意避免运行时错误