以下2行有啥区别? [复制]
Posted
技术标签:
【中文标题】以下2行有啥区别? [复制]【英文标题】:What is difference between below 2 lines? [duplicate]以下2行有什么区别? [复制] 【发布时间】:2018-05-08 11:43:53 【问题描述】:我正在尝试在 cellForRowAt indexPath 方法中添加代码,如下所示
cell.itemNameLabel.text = nameArray[indexPath.row]
但它显示错误为Cannot assign value of type 'Any' to type 'String?'
所以可以通过以下两种方式解决,
cell.fruitName.text = fruitArray[indexPath.row] as? String
或
cell.fruitName.text = (fruitArray[indexPath.row] as! String)
所以,我的问题是 2 个答案有什么区别?
【问题讨论】:
您可以解开可选值,例如: if let name = fruitArray[indexPath.row] as?字符串 cell.fruitName.text = name 【参考方案1】:cell.fruitName.text = fruitArray[indexPath.row] as? String
上面的返回类型是可选值。表示如果数组不包含字符串值,则返回nil
值。
cell.fruitName.text = (fruitArray[indexPath.row] as! String)
以上返回类型是非可选值。表示如果数组不包含字符串值,则会触发致命错误。
【讨论】:
是的。我更新了我的答案【参考方案2】:以下是所有选项的通用信息。请找到它。
当您使用!
并且fruitArray[indexPath.row] 是nil
时,它会触发运行时错误,但如果使用?
,它将正常失败。
您可以在Apple document找到更多详细信息
【讨论】:
所以 cell.fruitName.text = (fruitArray[indexPath.row] as!String) 是更好的使用方式吗? @NikitaPatil 不,强制换行意味着如果它是nil
,它将崩溃。在打开包装之前检查价值总是更好的。
我已经说过,如果它不是零,更好的解决方案是在使用之前检查 if let
OP 没有使用!
,他们使用的是as!
。那是强制施放,与强制展开略有不同。 let x = "x" as! Int
将崩溃,因为“x”不能转换为 Int。以上是关于以下2行有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章