swift學(xué)習(xí)之旅--可選鏈

1.可選鏈的含義

可選鏈,就是在聲明屬性的時候,在屬性的類型后面加上?問號,使得屬性有一個默認(rèn)值nil,這個特性非常方便,因為OC里,我們經(jīng)常會需要先判斷值是nil的情況和有值的情況。如果用可選鏈,就能免去寫一堆的if(xxx = nil)省心。

當(dāng)然,如果你用?可選鏈,那么當(dāng)你賦值的時候,編譯器會讓你提供默認(rèn)值,例如下面

func STATUSBAR_HEIGHT() -> CGFloat {
    return windowKey?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
}

2.?和!的區(qū)別

class Person {
    var residence: Residence?
}
 
class Residence {
    var numberOfRooms = 1
}

如果你創(chuàng)建一個新的 Person 實例,得益于可選項的特性,它的 residence 屬性會默認(rèn)初始化為 nil 。下面的代碼中, john 擁有值為 nil 的 residence 屬性:

let john = Person()

如果你嘗試訪問john的 residence 里的 numberOfRooms 屬性,通過在 residence 后放一個嘆號來強制展開它的值,你會觸發(fā)一個運行時錯誤,因為 residence 根本沒有值可以展開:

let roomCount = john.residence!.numberOfRooms
// 此時會報錯

或者你非??隙ǎ豢赡転閚il,一定取得到值那么就直接加上!,表示強制展開,當(dāng)然,你得承受可能會崩潰的后果。

3.官方文檔里是這么說的

你可以通過在你希望如果可選項為非 nil 就調(diào)用屬性、方法或者腳本的可選值后邊使用問號( ? )來明確可選鏈。這和在可選值后放嘆號( ! )來強制展開它的值非常類似。主要的區(qū)別在于可選鏈會在可選項為 nil 時得體地失敗,而強制展開則在可選項為 nil 時觸發(fā)運行時錯誤。

為了顯示出可選鏈可以在 nil 值上調(diào)用,可選鏈調(diào)用的結(jié)果一定是一個可選值,就算你查詢的屬性、方法或者下標(biāo)返回的是非可選值。你可以使用這個可選項返回值來檢查可選鏈調(diào)用是成功(返回的可選項包含值),還是由于鏈中出現(xiàn)了 nil 而導(dǎo)致沒有成功(返回的可選值是 nil )。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容