有什么区别时,我通过?
和!
Swift展开可选值由“?”和“!”
如果有类名,一个拆开包装的可选值,有一个属性名普罗阿
然后,如果我作出这样
var a:A? = A()
a?.proA
a!.proA
实例
我可以通过以上两种方式处理属性'proA'。如果我使用a.proA
,我知道我无法获得价值,因为a
是可选类型。
另外,我知道a!.proA
,因为它在力
解开的价值可以得到价值又是什么a?.proA
?
什么是a?.proA
和a!.proA
有什么区别时,我通过?
和!
Swift展开可选值由“?”和“!”
如果有类名,一个拆开包装的可选值,有一个属性名普罗阿
然后,如果我作出这样
var a:A? = A()
a?.proA
a!.proA
实例
我可以通过以上两种方式处理属性'proA'。如果我使用a.proA
,我知道我无法获得价值,因为a
是可选类型。
另外,我知道a!.proA
,因为它在力
解开的价值可以得到价值又是什么a?.proA
?
什么是a?.proA
和a!.proA
正如你所说,!
之间的差异强行解开可选。
var a: A? = A()
a!.prop
然而,如果可选从未分配一个值,这意味着它的nil
会发生什么?
var a: A?;
a!.pop
你得到了斯威夫特运行时错误(认为它是在其他语言例如,Java空指针异常的等价物)。
另一方面,如果您使用?
,则可以利用可选的链接。这使您可以优雅地遍历可选属性,而不用担心会导致运行时错误。如果沿链的某些中间属性为nil
,则整个表达式将返回nil
。
var a: A?;
a?.pop //returns nil, no runtime error
哦......!那么如果我使用?打开可选值,它比!更安全。谢谢! –
'a?'正在调用proA,因此'a'可能为零,这里我们通过'?'通知编译器'a'。如果编译器会得到零它默默无声地崩溃 –