【问题标题】:Swift unwrapping Optional value by "?" and "!" [duplicate]Swift 通过“?”展开可选值和 ”!” [复制]
【发布时间】:2017-07-24 15:33:07
【问题描述】:

?! 解开可选值有什么区别

如果有类名A并且有属性名proA

如果我做一个这样的实例

var a:A? = A()
a?.proA
a!.proA

我可以通过上述两种方式处理属性“proA”。我知道如果我使用a.proA 将无法获得价值,因为a 是可选类型。

另外,我知道a!.proA 可以获得价值,因为它可以有效地展开价值

a?.proA 是什么?

a?.proAa!.proA有什么区别

【问题讨论】:

  • a? 正在调用 proA,因此a 可能为零,这里我们通过? 通知编译器a。如果编译器将得到 nil,它会静默运行而不会崩溃

标签: swift optional


【解决方案1】:

正如你所说,! 强制解开可选。

  var a: A? = A()
  a!.prop

但是,如果从未为可选项赋值,即nil,会发生什么?

  var a: A?;
  a!.pop

你会得到一个 Swift 运行时错误(认为它相当于其他语言中的空指针异常,例如 Java)。

另一方面,如果您使用?,您可以利用可选链接。这使您可以优雅地遍历可选属性,而不必担心导致运行时错误。如果链上的某个中间属性是nil,则整个表达式将返回nil

 var a: A?;
 a?.pop //returns nil, no runtime error

【讨论】:

  • 哦……!!那么如果我使用?解开可选值,它比 ! 更安全。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多