【问题标题】: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 }

标签: ios swift uitableview


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2019-05-17
  • 2013-08-29
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多