1.可選類型
- 可選類型表示變量可以有值, 也可以沒有值
- C 和 Objective-C 中并沒有可選類型這個概念
- Swift中
只有可選類型才可以賦值為nil
- 如果你聲明一個可選常量或者變量但是沒有賦值,它們會自動被設置為nil
2.可選?類型格式
格式: Optional<類型> 或 在類型后面加上?號
var number: Optional<Int>
可選類型的取值是一個枚舉
None 沒有值
Some 有值
-
由于可選類型在Swift中隨處可見, 所以系統做了一個
語法糖
, 在類型后面加上?
var number: Int?
注意:- nil不能用于非可選的常量和變量。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型。
- Swift 的nil和 Objective-C 中的nil并不一樣。在 Objective-C 中,nil是一個指向不存在對象的指針, 所以Objective-C只有對象類型才能被設置為nil(基本類型不行)。在 Swift 中,
nil不是指針——它是一個確定的值,用來表示值缺失
。任何類型的可選狀態都可以被設置為nil,不只是對象類型。
3.推薦寫法
var number1: Double?//如果初始化不寫值,那么默認為nil
number = 2;
// Swift中可選類型的值不能當做普通類型的值來使用
// 如果想使用可選類型的值必須進行`解包`操作
// 只需要在變量/常量后面加上! 就可以解包
// * 解包代表著告訴系統, 該變量/常量中一定有值
var pi: Double?
pi = 3.14
print(pi)//打印出來是Optional(3.14)
4.解包
4.1強制解析(forced unwrapping)
- 通過感漢號實現:!,如:
number!
- init? 構造函數, ?表示不一定能夠實例化出對象
- !表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接
崩潰
- 提示: ? 和 ! 是所有剛剛接觸Swift的OC程序員最最蛋疼的問題, 前期開發要注意多看文檔和利用編譯器提示解決(option + 左擊鼠標變量)
注意 - 在Swift開發中, 盡量不要使用強制解包, 不安全
//let url: NSURL?
let url = NSURL(string: "http://www.baidu.com")
print(url)
url!
4.2可選綁定解包(optional binding)
- 不需要考慮url是否有值, 能進入{}一定有值
- 不僅可以用來判斷可選類型中是否有值,同時可以將可選類型中的值賦給一個常量或者變量
- 可選綁定可以用在if和while語句中
- 提示:
在實際開發中,使用頻率很高
- 可選綁定中的變量/常量只能在if后面的{}中使用
if let temp = url {
url//能進來,那么url是一定有值的
}
//但是當可選類型過多時,出現下面情況,代碼看起來就非常low了
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
if let temp1 = value1 {
if let temp2 = value2 {
if let temp3 = value3 {
if let temp4 = value4 {
let sum = temp1 + temp2 + temp3 + temp4
}
}
}
}
guard
- guard語句是在Swift 2.0中引進的,它是用途是
在未滿足某個條件時,提供一個退出的路徑
- 格式:
guard 表達式 else{}
注意: - guard中的變量/常量 可以在guard后面使用
- guard一般用于避免使用強制拆包, 優化代碼結構
func test() {
let value1: Int? = 10
let value2: Int? = 20
let value3: Int? = 30
let value4: Int? = 40
guard let temp1 = value1 else {//guard一般寫在函數里
return
}
guard let temp2 = value2 else {
return
}
guard let temp3 = value3 else {
return
}
guard let temp4 = value4 else {
return
}
let sum = temp1 + temp2 + temp3 + temp4
print(sum)
}
4.3隱式解析可選類型(implicitly unwrapped optionals)
- 有時候在程序架構中,第一次被賦值之后,可以確定一個可選類型總會有值。在這種情況下,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值
- 隱式解析可選類型, 并不需要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型,但是可以被當做非可選類型來使用
- 格式:
將可選類型后面的?改為!
示例: let loginBtn: UIButton!
- 注意:如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型。如果你需要在變量的生命周期中判斷是否是nil的話,請使用普通可選類型
//這種多用于storyboard或xib連線時定義的屬性
var button: UIButton!
button = UIButton()
print(button)