前言
盡量不使用
可選類型(也有叫‘可選項(xiàng)’的),算是Swift的一個(gè)特色,可以讓程序在編寫階段就發(fā)現(xiàn)大部分因?yàn)樽兞繛榭斩鴮?dǎo)致的問題,提高安全性;(dart的空安全就于此類似,對(duì)flutter還不太熟,如果說錯(cuò),請(qǐng)刪除)
何時(shí)使用
之前說了 變量聲明階段必須有值,但是實(shí)際開發(fā)中總有特例,總有在聲明或初始化階段無法確定值的情況,這時(shí)就需要可選類型;
如何聲明
在變量聲明的基礎(chǔ)上添加?問號(hào):
var 變量名: 類型名? = 值
eg: var name: String?
這里注意要用var修飾 用let修飾沒有意義,'類型名'不可省略,’值‘可以省略;
var name: String?
name = "baidu"
print(name!) // baidu 如果name = nil 會(huì)crash
print(name ?? "s")// baidu 如果name = nil 則輸出s
print(name as Any)// Optional("baidu") 顯然這不是我們想要的 如果name = nil 則輸出 nil
if let str = name { // name如果有值,會(huì)自動(dòng)解包并賦值給str
print(str) // baidu
}else{
print("name is nil")
}
var age: Int! = 10 //如果聲明時(shí)用嘆號(hào),將來使用時(shí)會(huì)隱式解包 非常不建議使用!?。。。?age = 18
let age2: Int = age // 隱式解包只會(huì)發(fā)生在賦值時(shí)?
print(age as Any, age2) // Optional(18) 18 如果age = nil 會(huì)crash
怎樣理解
可選類型可以理解為一個(gè)特殊類型,只有兩種情況: 有值(Optional)、無值(nil) 。
然而我們想要使用可選類型中的值,則需要解包。
解包:正好今天換工位,領(lǐng)了一個(gè)紙箱,可以把可選類型比作一個(gè)紙箱,紙箱中要么是空的,要么有東西。而從有東西的紙箱中取出這個(gè)東西的過程成為解包;解包后紙箱就被丟棄,值便裸露出來;
使用中提到了解包,常用的有三種形式:1. 用嘆號(hào)!是強(qiáng)制解包,不是在非常確定有值的情況下不要使用;2. 用雙問號(hào)?? 問號(hào)左邊的變量自動(dòng)解包如果有值則返回,如果未nil則返回問號(hào)右側(cè)的值;3. 用 if let str = name {} ;
可選鏈
提到可選類型,就得說說可選鏈:由可選類型的屬性構(gòu)成的調(diào)用鏈條。eg: preson.pet?.name = "Jerry"
class Dog {
var name: String? = "Tom"
}
class Preson {
///寵物
var pet: Dog? = nil
}
let preson = Preson()
preson.pet?.name = "Jerry"
print(preson.pet?.name as Any) // 輸出 nil 這里pet右邊的問號(hào)必須要加,如果pet=nil則不會(huì)調(diào)用后邊的name,而直接返回nil。反之如果?變!則會(huì)crash
preson.pet = Dog()
preson.pet?.name = "Jerry"
print(preson.pet?.name ?? "無") // 輸出 Jerry
print(preson.pet!.name!) // 輸出 Jerry 不建議這樣寫