原創(chuàng)文章。談一談對(duì)Swift中可選類型的理解與實(shí)際應(yīng)用,如有錯(cuò)誤,望讀者指正,謝謝!
什么是可選類型?
可選類型是一種用來(lái)強(qiáng)檢驗(yàn)一個(gè)常量或變量是否具有值的語(yǔ)法。可選類型的存在讓Swift成為一種強(qiáng)類型語(yǔ)法
怎么使用可選類型?
0.可選類型的含義
可選類型可用于一個(gè)對(duì)象的初始值的情況。
由于在Swift中定義一個(gè)對(duì)象時(shí),必須明確指明其初始值,不能為空值。如果不想在定義時(shí)賦予初始值,唯一的辦法就是將其定義為可選類型
需要注意的是:
可選類型中的nil與OC中的nil代表的含義是不同的。
OC中的nil表示空指針,代表變量不指向任何內(nèi)存地址。OC中對(duì)空指針發(fā)送消息不會(huì)發(fā)生任何事情
Swift中nil也是一種類型,表示變量或常量的值缺失。在Swift中使用一個(gè)值缺失的對(duì)象,將會(huì)導(dǎo)致程序崩潰
1.定義可選類型
- 常規(guī)寫法
var name : Optional<String>
- 快捷寫法(常用)
var name : String?
</br>
2.從可選類型中取值
- 強(qiáng)制解析:
在可選類型后加上一個(gè)"!"即可取得可選類型中的值
print(name!)
強(qiáng)制解析是危險(xiǎn)操作,如果對(duì)象的實(shí)際值為nil,解包會(huì)導(dǎo)致crash。所以如果不能確定對(duì)象必然有值,不建議直接使用強(qiáng)制解析,而是先進(jìn)行一次校驗(yàn):
if name != nil {
print(name!)
}
- 可選綁定(常用)
寫法1:
if let tempName = name {
print(tempName)
}
這個(gè)語(yǔ)句會(huì)先判斷name是否有值,如果沒(méi)有值,則判斷條件為false,不會(huì)執(zhí)行{}中的語(yǔ)句。 如果name有值,則系統(tǒng)會(huì)對(duì)其進(jìn)行解包,將解包后的結(jié)果賦值給tempName
寫法2:
if let name = name {
print(name)
}
利用了變量作用域的原理,用臨時(shí)變量覆蓋了原本的變量。本質(zhì)上與寫法1一樣
- 通過(guò)guard的方式進(jìn)行可選綁定(常用)
由于在Swift中除了if可以進(jìn)行條件判斷外,還可使用guard進(jìn)行判斷。因此同樣可以使用guard語(yǔ)句進(jìn)行可選綁定:
guard let name = name else {
return
}
guard校驗(yàn)與if類似,如果name有值,則進(jìn)行賦值,跳過(guò)else中的代碼。如果name為nil,則只需else中的語(yǔ)句,不再繼續(xù)往下執(zhí)行
- 空合運(yùn)算符(摘自 <<The Swift Programming Language>>中文翻譯)
空合運(yùn)算符即??,使用示例如下:
realName = name ?? ""
表示如果name有值時(shí)則將name解析并賦值給realName,否則則將運(yùn)算符后的默認(rèn)值(即空字符串)賦值給realName
</br>
</br>
"!"和"?"運(yùn)算符的含義
在Swift中經(jīng)常可以看到這兩個(gè)運(yùn)算符,那么他們到底有哪些含義呢?
一.?
1.用在三目運(yùn)算符中,表示條件選擇,例如:
let isAdult: Bool = (age > 18) ? true : false
當(dāng)?之前的條件為真時(shí),執(zhí)行問(wèn)號(hào)后的語(yǔ)句,否則執(zhí)行冒號(hào)后的語(yǔ)句
2.用在定義一個(gè)變量時(shí),用來(lái)表示該變量為可選類型,例如:
var name: String?
之后給這個(gè)變量賦值時(shí),可以賦一個(gè)確定有值的String,也可以賦值為nil
3.用在語(yǔ)句中,根據(jù)變量的值是否為nil決定是否繼續(xù)執(zhí)行代碼,例如:
var person: Person?
person?.name.firstName = "Wang"
如果person的實(shí)際值為nil,則整句代碼都不會(huì)執(zhí)行。如果person不為nil,則會(huì)執(zhí)行代碼,對(duì)firstName賦值
4.在賦值時(shí),使用"??"來(lái)進(jìn)行條件判斷,賦默認(rèn)值,例如:
var age: Int = person.age ?? "10"
如果person的age值不為nil,則會(huì)給變量age賦值。如果為nil,則將默認(rèn)值10賦值給age
5.跟在as后,表示可選的類型轉(zhuǎn)換,例如:
let str: String? = "abc"
let nsStr = str as? NSString
這句代碼將會(huì)把str轉(zhuǎn)化為一個(gè)NSString?的對(duì)象。nsStr的類型是NSString?,即可選類型。
as?常用在向下轉(zhuǎn)型,也就是將子類的對(duì)象轉(zhuǎn)化為父類對(duì)象。
6.用在執(zhí)行協(xié)議中的可選方法時(shí)。因?yàn)樽裱瓍f(xié)議的代理不一定實(shí)現(xiàn)了可選方法,所以在調(diào)用可選方法時(shí),需要在方法名后加上一個(gè)?。如果實(shí)現(xiàn)了方法,則會(huì)調(diào)用,否則不執(zhí)行
"?"的用法基本就這些了,如果有遺漏的,歡迎補(bǔ)充。