swift是一門類型安全的編程語言,聲明的變量默認情況下是不能爲非空值(nil)的,如果需要這個變量可爲nil,那麼就需要設置爲可選類型。
可選類型其根源是一個枚舉型,裏面有None和Some兩種類型。其實所謂的nil就是Optional.None, 非nil就是Optional.Some, 然後會通過Some(T)包裝(wrap)原始值,這也是爲什麼在使用Optional的時候要拆包(從enum裏取出來原始值)的原因.
強制解析
上面說到可選型使用Some(T)包裝(wrap)了原始值
如圖,即使我們知道str有值,但是直接輸出是可選型而不是String類型。
那麼要從str中獲得它的字符串值該如何獲得
swift中使用!來進行解包,即
獲得的就是str的字符串值
注意:! 強制解析時必須保證可選類型不爲nil,否則強制解析一個爲nil的可選類型會報錯
fatal error: unexpectedly found nil while unwrapping an Optional value
自動解析
在聲明可選型的時候把?替換爲!即可。這樣可選變量在使用時就不需要再加一個感嘆號(!)來獲取值,它會自動解析。
可以看出,使用!聲明的類型仍然是可選類型,在str爲nil時仍爲nil,在strTest有值時不需要使用strTest!就可以取到字符串值。
強制解析與自動解析中的 ! 區別
在聲明時的 ! 只是對可選類型的一種聲明方式。誤區:有些人認爲使用!聲明的變量就必須爲非空,其實不是這個意思。這裏的 !是說在非空時str1取值取到的是解包後的值,而不再是Optional();
在調用時的 ! 是強制解包,也就是求取Optional.Some(T)包裝下的值,所以爲 Optional值 = nil 時會報錯
可選綁定
既然可選型可以爲空,那麼通常我們需要判斷非空時要怎麼處理,爲nil時應該怎麼處理。
最常用的判斷方式就是if語句了
這是我們熟悉的if語句寫法,swift提供了更方便的if let/var語句,也稱爲可選綁定
爲什麼稱if let是一個語句而不再是 if語句呢,因爲
if let strTemp = str5 時進行的是解析賦值。strTemp1 = str5!這時才和strTemp值相等。
xcode中輸入iflet會自動補全就像是forin語句,但是ifvar不會不全,但是不代表ifvar不可以
可選鏈 Optional chaining
爲什麼會有可選鏈呢?
如圖,我們使用可選值變量的時候各種判斷有時候還需要if嵌套真的很麻煩,所以出現了可選鏈
通過 ? 語法調用屬性或者方法。即?出現在調用時,而不是出現在變量的定義中,稱爲可選鏈。
?返回一個可選值, 可選值爲nil則代碼語句執行結果爲nil,可選值非空則繼續往下執行。
如:people.money?.canBuyIphone()中如果money爲nil,則整個語句返回nil。如果money有值則執行canBuyIphone()方法,判斷是否能購買iPhone
也就是說可選鏈是一個可選值,一個爲nil,一個爲非nil
空合運算符 ??
什麼是空合運算符呢, 符號表示就是 ?? ,有點類似三目運算符?:的變種
還是上面的例子,我們把if let語句改成了三目運算符,有沒有發現可選鏈組成的三目運算符是相當的霸氣。而使用 ?? (空合運算符)就簡短了不少。
x ?? y表示判斷x是否爲nil,若不爲nil,則將x解包後返回,否則,取y的值