swift是一門類型安全的編程語(yǔ)言微服,聲明的變量默認(rèn)情況下是不能為非空值(nil)的剖踊,如果需要這個(gè)變量可為nil脸秽,那么就需要設(shè)置為可選類型骂删。
可選類型其根源是一個(gè)枚舉型掌动,里面有None和Some兩種類型。其實(shí)所謂的nil就是Optional.None, 非nil就是Optional.Some, 然后會(huì)通過Some(T)包裝(wrap)原始值宁玫,這也是為什么在使用Optional的時(shí)候要拆包(從enum里取出來原始值)的原因.
強(qiáng)制解析
上面說到可選型使用Some(T)包裝(wrap)了原始值
如圖粗恢,即使我們知道str有值,但是直接輸出是可選型而不是String類型欧瘪。
那么要從str中獲得它的字符串值該如何獲得
swift中使用!來進(jìn)行解包眷射,即
獲得的就是str的字符串值
注意:! 強(qiáng)制解析時(shí)必須保證可選類型不為nil,否則強(qiáng)制解析一個(gè)為nil的可選類型會(huì)報(bào)錯(cuò)
fatal error: unexpectedly found nil while unwrapping an Optional value
自動(dòng)解析
在聲明可選型的時(shí)候把?替換為妖碉!即可涌庭。這樣可選變量在使用時(shí)就不需要再加一個(gè)感嘆號(hào)(!)來獲取值,它會(huì)自動(dòng)解析欧宜。
可以看出坐榆,使用!聲明的類型仍然是可選類型,在str為nil時(shí)仍為nil冗茸,在strTest有值時(shí)不需要使用strTest席镀!就可以取到字符串值。
強(qiáng)制解析與自動(dòng)解析中的 ! 區(qū)別
在聲明時(shí)的 ! 只是對(duì)可選類型的一種聲明方式夏漱。誤區(qū):有些人認(rèn)為使用豪诲!聲明的變量就必須為非空,其實(shí)不是這個(gè)意思麻蹋。這里的 跛溉!是說在非空時(shí)str1取值取到的是解包后的值,而不再是Optional()扮授;
在調(diào)用時(shí)的 ! 是強(qiáng)制解包,也就是求取Optional.Some(T)包裝下的值专肪,所以為 Optional值 = nil 時(shí)會(huì)報(bào)錯(cuò)
可選綁定
既然可選型可以為空刹勃,那么通常我們需要判斷非空時(shí)要怎么處理,為nil時(shí)應(yīng)該怎么處理嚎尤。
最常用的判斷方式就是if語(yǔ)句了
這是我們熟悉的if語(yǔ)句寫法荔仁,swift提供了更方便的if let/var語(yǔ)句,也稱為可選綁定
為什么稱if let是一個(gè)語(yǔ)句而不再是 if語(yǔ)句呢芽死,因?yàn)?/p>
if let strTemp = str5 時(shí)進(jìn)行的是解析賦值乏梁。strTemp1 = str5!這時(shí)才和strTemp值相等关贵。
xcode中輸入iflet會(huì)自動(dòng)補(bǔ)全就像是forin語(yǔ)句,但是ifvar不會(huì)不全遇骑,但是不代表ifvar不可以
可選鏈 Optional chaining
為什么會(huì)有可選鏈呢?
如圖揖曾,我們使用可選值變量的時(shí)候各種判斷有時(shí)候還需要if嵌套真的很麻煩落萎,所以出現(xiàn)了可選鏈
通過 ?? ?語(yǔ)法調(diào)用屬性或者方法。即炭剪?出現(xiàn)在調(diào)用時(shí)练链,而不是出現(xiàn)在變量的定義中,稱為可選鏈奴拦。
?返回一個(gè)可選值媒鼓, 可選值為nil則代碼語(yǔ)句執(zhí)行結(jié)果為nil,可選值非空則繼續(xù)往下執(zhí)行。
如:people.money?.canBuyIphone()中如果money為nil绿鸣,則整個(gè)語(yǔ)句返回nil疚沐。如果money有值則執(zhí)行canBuyIphone()方法,判斷是否能購(gòu)買iPhone
也就是說可選鏈?zhǔn)且粋€(gè)可選值枚驻,一個(gè)為nil濒旦,一個(gè)為非nil
空合運(yùn)算符 ??
什么是空合運(yùn)算符呢, 符號(hào)表示就是 ?? ?再登,有點(diǎn)類似三目運(yùn)算符?:的變種
還是上面的例子尔邓,我們把if let語(yǔ)句改成了三目運(yùn)算符,有沒有發(fā)現(xiàn)可選鏈組成的三目運(yùn)算符是相當(dāng)?shù)陌詺怙笔浮6褂??? (空合運(yùn)算符)就簡(jiǎn)短了不少梯嗽。
x ?? y表示判斷x是否為nil,若不為nil沽损,則將x解包后返回灯节,否則,取y的值