Swift3之細緻理解Optional(可選類型)

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的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章