Swift 中的可選類型,意味著變量可能是 nil
標(biāo)記
- 使用
T?或者Optional<T>來表示T這個(gè)類型是一個(gè)可選的
let d: String? = nil
let a: Optional<String> = "a"
-
!有兩個(gè)意義:
- 強(qiáng)制解包。當(dāng)確定該變量不為
nil的時(shí)候,可以在變量后加上!來獲取值 (當(dāng)該值為nil時(shí)會(huì)引發(fā) crash)
let a: Optional<String> = "a"
let d: String? = nil
print(a!)
print(d!)
輸出:
a
Fatal error: Unexpectedly found nil while unwrapping an Optional value
- 在聲明的時(shí)候使用代表 在后續(xù)調(diào)用的時(shí)候 會(huì)自動(dòng)加上
!來強(qiáng)制解包。
使用以下例子證明(因?yàn)樽詣?dòng)加了 ! 因此會(huì)引發(fā) crash):
var b: String! = nil
b.shuffled()
輸出:
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
注意,實(shí)際上,在變量后加上了 ! 之后,說明該變量是可選類型,隱式被加上了 ?,相當(dāng)于:var a: String! == var a: String?!
var b: String! = nil
print(type(of: b))
輸出:
Optional<String>
在聲明變量的時(shí)候加上 ! 的場(chǎng)景,一般是聲明類的屬性的時(shí)候,假如不在 init() 方法中賦值(比如在 viewDidLoad 的時(shí)候才賦值),需要讓屬性成為可選類型,而假如使用 let btn:UIButton? 用 ? 去修飾的話,每次訪問這個(gè)屬性都需要手動(dòng)加上 !,就不方便,因此需要 let btn:UIButton! 去定義
可選綁定(if let & guard let else)
由于使用了 let,因此在語句中要使用 let 聲明的變量
-
if let中假如參數(shù)(們)不為 nil,會(huì)執(zhí)行語句
let m: String? = nil;
let n: String? = "hi"
if let tmp = m {
print(tmp)
}
if let tmp = n {
print(tmp)
}
輸出:
hi
-
guard let else意味著守衛(wèi)變量,僅當(dāng)let的變量為nil的時(shí)候才會(huì)調(diào)用{}中的語句,當(dāng)該語句被調(diào)用時(shí),理應(yīng)要跳出當(dāng)前函數(shù)或者拋出異常 不讓此函數(shù)或者runloop繼續(xù)執(zhí)行下去,因此,在{}中需要有return或者throw
func tmpFunc() {
guard let tmp = m else {
print("m is nil")
return
}
guard let tmp2 = n else {
print("n is nil")
return
}
// 當(dāng)函數(shù)執(zhí)行至此,tmp & tmp2 一定有值
}
另外, guard 中聲明的變量,作用域不僅在其 {} 中