?的几种使用场景:
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
3.用于安全调用protocol的optional方法
4.使用 as? 向下转型(Downcast)
理解:
?
.在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个?
(同上面的2), 如果是nil值,会跳过后面的操作不执行 / 如果有值,就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性,比如:
let hashValue = strValue?.hashValue
strValue是Optional的字符串,如果strValue是nil,则hashValue也为nil,如果strValue不为nil,hashValue就是strValue字符串的哈希值(其实也是用Optional wrap后的值)
!
.在使用时, 表示自动解包, 自己不会去判断有没有值, 直接解包, 这样会发生什么?
答: strValue不小心为nil的话,就会出错,crash掉。
let hashValue = strValue!.hashValue
假设我们知道strValue一定是非nil的,就能直接加上!,强制拆包(unwrap)并执行后面的操作。
当然我们可以在使用之前手动添加判断
if strValue {
let hashValue = strValue!.hashValue
}```
###!大概也有两种使用场景
1.强制对Optional值进行拆包(unwrap)
2.声明Implicitly Unwrapped Optionals值,一般用于类中的属性