Swift中的可選類型

原創(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ǔ)充。

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

相關(guān)閱讀更多精彩內(nèi)容

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