一、Optional 定義歸納
(1).Swift中聲明一個變量或常量時需要返回nil。
(2).Swift中基礎類型如整型、布爾等可空時為nil。
(3).Swift中nil也代表一個值:空值。
(4).OC中的nil和Swift有一些需求,OC只有對象才能為nil。
(5).當我們需要定義一個可空的變量或常量時,Optional就發揮作用了,在 Swift中定于常量或變量時如果類型不是Optional是不能為nil的。
二、Optional 聲明
**定義可選類型只需要在類型后面加上 ( ? ) **
有以下幾種聲明方法:
//1.使用Optional聲明(可選類型是一個枚舉)
var name:Optional<String>
//1.賦值
name = Optional("Danny")
//2.常用聲明
var age:Int?
//2.賦值
age = 17
//3.常量聲明
let notes:NSString?
//3.賦值(常量只能賦一次值)
notes = "this is test"
三、Optional 拆包
(1).為什么我們要對Optional拆包
申明為Optional后,不拆包的格式是被Optional包住的:Optional("Danny");實際上我們需要使用的是Danny這個值,所以需要拆包得到
(2).拆包分為:顯式拆包和隱式拆包
1.顯式拆包
在我們事先聲明好的Optional類型名后面加( !)
//聲明
var name:String? = "Danny"
//顯式拆包
print(name!)
2.隱式拆包
當我們確定該變量一定會有值的時候在類型后面加( ! )
//確定name一定會有值
var name:String!= "Danny"
四、Optional Binding
(1).判斷一個可選類型是否為nil,通常寫法是下面這種
var name:String? = "Danny"
if name != nil {
print("not nil")
}else{
print("nil")
}
(2).判斷一個可選類型是否為nil并且我們需要使用該可選類型怎么辦呢?
var name:String? = "Danny"
if name != nil {
print(name!) //使用 !拆包
}else{
print("nil")
}
(3).接上(2)如果我們需要使用多次使用到name?難道要多次使用!拆包嗎?答案是肯定這種方法不可取的,下面這種方法表示只進行一次拆包。
var name:String? = "Danny"
if let letName = name {
print(letName)
}else{
print("nil")
}
說明:通過在條件判斷語句中把Optional值直接給一個臨時常量,Swift會自動檢測Optional是否包含值,如果包含值,會隱式的拆包并給那個臨時常量,在接下來的上下文中就能直接使用這個臨時常量了
四、Optional Chaining
可選鏈主要的應用場景是比較復雜的對方,如果一個對象中的屬性包含了一個對象,子對象中的屬性又包含了一個對象,這樣就形成了可選鏈,可空返回nil。
class Person {
var myPet:Dog?
}
class Dog{
var myToy:Toy?
}
class Toy {
var name = "name"
init(name:String){
self.name = name;
}
}
let denny = Person();
denny.myPet = Dog();
denny.myPet?.myToy = Toy(name: "Ball")
if let toy = denny.myPet?.myToy{
toy.name
}
注意:整條鏈上只要有一個Optional返回nil,則整條鏈都為nil