2017-07-24 31 views
0

有什么区别时,我通过?!Swift展开可选值由“?”和“!”

如果有类名,一个拆开包装的可选值,有一个属性名普罗阿

然后,如果我作出这样

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

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

另外,我知道a!.proA,因为它在力

解开的价值可以得到价值又是什么a?.proA

什么是a?.proAa!.proA

+0

'a?'正在调用proA,因此'a'可能为零,这里我们通过'?'通知编译器'a'。如果编译器会得到零它默默无声地崩溃 –

回答

1

正如你所说,!之间的差异强行解开可选。

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 
+1

哦......!那么如果我使用?打开可选值,它比!更安全。谢谢! –

相关问题