Swift 提供了雙問號(hào)操作符(??),英文叫 Double Question Mark骑歹≡だ樱可以用來快速對(duì) nil 進(jìn)行條件判斷。當(dāng)我們獲取一個(gè)可選值(optional value)時(shí)道媚,如果希望其為 nil 的情況下返回一個(gè)非 nil 值扁掸,那么就可以把這個(gè)返回值放在 ?? 后面。下面演示幾個(gè)常見的使用場(chǎng)景最域。
1谴分,可選值不為nil則使用可選值,為nil則使用默認(rèn)值
比如我們把 userName 這個(gè)參數(shù)值顯示在 label 中羡宙,但希望 userName 如果為 nil 的話便顯示"未知用戶"狸剃。
這個(gè)我們可以使用三元條件運(yùn)算來實(shí)現(xiàn):
`var` `userName:``String``?`
`self``.label.text = userName != ``nil` `? userName : ``"未知用戶"`
但使用雙問號(hào)操作符會(huì)更加簡(jiǎn)單:
`var` `userName:``String``?`
`self``.label.text = userName ?? ``"未知用戶"`
2掐隐,as? 類型轉(zhuǎn)換后處理nil值
`let` `message = json[``"message"``] ``as``? ``String` `?? ``"no message"`
swift中狗热?和钞馁!的出現(xiàn),歸根結(jié)底的原因匿刮,我認(rèn)為是swift在設(shè)計(jì)時(shí)引入的一個(gè)重要概念僧凰,就是所有的變量必須初始化,如果不初始化熟丸,就無法通過編譯器的檢查训措。這么做的好處就是從一開始就規(guī)避了因?yàn)樽兞课闯跏蓟瘜?dǎo)致的一些奇奇怪怪的bug。下面代碼展示了在使用一個(gè)未初始化的變量時(shí)光羞,編譯器報(bào)出的錯(cuò)誤绩鸣。
var variable:Int
print(variable)
//Variable 'variable' used before being initialized
1.可選類型
swift默認(rèn)要求所有變量必須初始化,但是開發(fā)過程中纱兑,或許會(huì)遇到一些對(duì)象的成員變量或者其他變量呀闻,并不會(huì)用到,也沒有必要初始化潜慎。這時(shí)就用到了swift為我們提供的可選類型捡多,就是表示程序員知道變量必須初始化,但是根據(jù)程序邏輯铐炫,程序員認(rèn)為不是一定要初始化該變量垒手。例如上面的例子,可以寫成如下:
var variable:Int?
print(variable)
//nil
或者不用”?”用”O(jiān)ptional”關(guān)鍵字
var variable:Optional
print(variable)
//nil
聲明為可選類型之后倒信,編譯就可以通過了科贬,因?yàn)槭浅绦騿T手動(dòng)聲明為可選類型,說明程序員已經(jīng)了解了該變量可能并不會(huì)初始化鳖悠,程序員可以對(duì)該變量負(fù)責(zé)唆迁。
下面說一下這個(gè)”nil”,可選類型不初始化的情況下竞穷,變量的值為nil唐责,這個(gè)nil和Objective-C中的nil并不相同,從一些swift語言的學(xué)習(xí)書籍中找到了下面的說明:
- 在Objective-C中nil表示的是一個(gè)指向不存在對(duì)象的指針瘾带,而swift中表示空的關(guān)鍵字為”nil”鼠哥,它沒有其他含義。
- 可選類型的變量或者常量在有值的時(shí)候返回值看政,沒有值的時(shí)候不會(huì)返回任何東西朴恳,包括false。
- nil不能用于非可選的變量或者常量允蚣,如果你的代碼中可能會(huì)出現(xiàn)沒有值的情況于颖,請(qǐng)務(wù)必聲明其為可選類型,如果你聲明了一個(gè)可選變量或者常量沒有初始化嚷兔,程序會(huì)默認(rèn)賦值為nil
1.1可選鏈森渐,可選鏈就是將可選的調(diào)用鏈接在一起形成一個(gè)鏈做入,如果任何一個(gè)節(jié)點(diǎn)為空(nil),將導(dǎo)致整個(gè)可選鏈?zhǔn)隆R娙缦率纠?/p>
class Student {
var country:Country?
}
class Country {
var name:String = "China"
var capital:Capital?
}
class Capital{
var mayor:String = "Mayor Liu"
var name:String="Beijing"
}
var xiaoli = Student()
xiaoli.country = Country()
if let country = xiaoli.country?.capital?.name {
print("Xiaoli is from \(xiaoli.country?.capital?.name)")
} else {
print("不知道哪來的>箍椤!耐齐!")
}
2.隱式解析可選
隱式解析可選和可選類型相似浪秘,都是由程序員對(duì)變量的初始化負(fù)責(zé)。隱式解析可選的含義是確定變量或者常量一定有值埠况。如下代碼耸携,使用!將變量variable聲明為隱式解析可選辕翰,就相當(dāng)于程序員在聲明的時(shí)候告訴編譯器违帆,確定該變量一定會(huì)有值,這樣就編譯器就不會(huì)拋出變量未初始化的錯(cuò)誤金蜀。雖然躲過了編譯器的檢查刷后,但是程序真正運(yùn)行時(shí),由于變量variable未初始化渊抄,值為nil尝胆,所以程序會(huì)crash。
var variable:Int!
print(variable)
//fatal error: unexpectedly found nil while unwrapping an Optional value
2.1隱式解析可選的其他使用
有時(shí)候在編碼的過程中由上下文的邏輯能清晰的確定變量有值护桦,這時(shí)就可以選擇使用隱式解析可選含衔,如下示例:
class Student {
var country: Country?
}
class Country {
var name:String="China"
}
var xiaoli = Student()
xiaoli.country = Country()
var name = xiaoli.country!.name;
print(name)
轉(zhuǎn)載:http://www.reibang.com/p/aec35fd36219