1. 和別的語言不同,系統(tǒng)不會(huì)自動(dòng)給變量設(shè)置初始值,也就是說變量不會(huì)有默認(rèn)值。所以在使用變量之前需要進(jìn)行初始化,否則就會(huì)出錯(cuò)。
2. 利用泛型定義一個(gè)Optional類型的變量,從右側(cè)可以看出,它是空值,沒有初始值。Optional其實(shí)是個(gè)枚舉,里面有None和Some兩種類型,用來包裝原始值。
3. 定義一個(gè)可選類型的字符串變量,從右側(cè)的結(jié)果可以看出,它的值也是空值。
5. 由于該變量的值為空,所以出現(xiàn)錯(cuò)誤提示,需要對(duì)變量進(jìn)行初始化操作。接著對(duì)這兩行代碼進(jìn)行修改。
6. 兩行代碼各增加了一個(gè)問號(hào)。前一個(gè)問號(hào)的作用是聲明一個(gè)Optional變量,后一個(gè)問號(hào)的作用是,在對(duì)Optional值操作時(shí),判斷是否可以響應(yīng)后面的操作。
7. 因?yàn)樽兞康闹禐榭?,所以無法執(zhí)行第14行代碼中的第一個(gè)問號(hào)后面的代碼。此時(shí)雙問號(hào)就發(fā)揮了作用,當(dāng)前面的代碼無法執(zhí)行時(shí),就采用雙問號(hào)后面的值。
8. 將第17行中的第一個(gè)問號(hào),修改為感嘆號(hào),此時(shí)也出現(xiàn)了錯(cuò)誤提示,這是因?yàn)楦袊@號(hào)會(huì)對(duì)左側(cè)的Optional值進(jìn)行拆包(從枚舉里面取出來原始值)。
11. 此時(shí)再使用感嘆號(hào),對(duì)被Optional包裹的變量進(jìn)行拆包,現(xiàn)在已經(jīng)可以在右側(cè)正常顯示它的值了,并且沒有被Optional包裹。
12. 如果將感嘆號(hào)更改為問號(hào),也可以正常獲取它的值,但是因?yàn)闆]有拆包的原因,所以它的值會(huì)被Optional包裹。
13. 如果一定要使用問號(hào),也可以給它補(bǔ)充一個(gè)默認(rèn)值,點(diǎn)擊此處的修復(fù)按鈕,添加一個(gè)默認(rèn)值。
14. 此時(shí)會(huì)出現(xiàn)一對(duì)問號(hào),然后在問號(hào)的后方輸入當(dāng)變量的值為空時(shí),選用該默認(rèn)值。
15. 此時(shí)右側(cè)可以正常顯示結(jié)果了。
16. 傳統(tǒng)的空值判斷,通常要使用if語句,代碼量比較大,而使用問號(hào)和感嘆號(hào),則可以很簡潔的進(jìn)行空值的判斷。下面就是一個(gè)空值判斷的示例。
17. 此時(shí)已經(jīng)定義了兩個(gè)類,并給兩個(gè)類都添加一個(gè)Optional屬性。
18. 繼續(xù)給第二個(gè)類添加一個(gè)寵物類Optional屬性。
19. 初始化第二個(gè)類的實(shí)例對(duì)象。
20. 打印該對(duì)象的寵物屬性,因?yàn)樵搶傩詻]有初始值,所以在本行代碼的右側(cè)實(shí)時(shí)反饋區(qū),顯示它的值為空。
21. 如果需要訪問寵物屬性的名稱屬性,則在寵物屬性之后添加一個(gè)問號(hào),然后再訪問名稱屬性,這樣當(dāng)寵物屬性的值為空時(shí),直接返回空值,不再嘗試獲取名稱屬性。
22. 這樣使用一行代碼,就完成了通常需要使用多行if語句進(jìn)行空值判斷的功能。接著對(duì)寵物屬性進(jìn)行初始化。
23. 打印該對(duì)象的寵物屬性,因?yàn)樵搶傩砸呀?jīng)擁有初始值,所以在本行代碼的右側(cè)實(shí)時(shí)反饋區(qū),顯示了它當(dāng)前的值。
24. 接著使用相同的方式,獲取寵物的名稱屬性,因?yàn)槊Q屬性沒有初始值,所以右側(cè)顯示的結(jié)果為空。
26. 最后再嘗試獲取寵物的名稱屬性時(shí),右側(cè)的實(shí)時(shí)反饋區(qū)已經(jīng)能夠正常顯示名稱屬性的值了。
本文整理自:《Swift4互動(dòng)教程》,真正的[手把手]教學(xué)模式,用最快的速度上手iOS開發(fā)和Swift語言,蘋果商店App Store免費(fèi)下載:https://itunes.apple.com/cn/app/id1320746678,或掃描本頁底部的二維碼。課程配套素材下載地址:資料下載


























