了解過設(shè)計(jì)模式的人都知道責(zé)任鏈模式(如果你不知道什么是責(zé)任鏈模式,可以閱讀我的博文《[23設(shè)計(jì)模式之責(zé)任鏈模式 (COR)](http://blog.csdn.net/y550918116j/article/details/48596903)》),在OC的手勢(shì)響應(yīng)鏈也是基于這種模式開發(fā)的。
責(zé)任鏈模式的核心可以理解為
~~~
if {
} else if {
} else {
}
~~~
如果每一次都這樣寫,代碼就特別多,也不美觀。
Swift考慮到這種情況設(shè)計(jì)了可選鏈,可選鏈的核心是兩個(gè)操作符號(hào):
- **?**:當(dāng)’?’前有值時(shí),執(zhí)行’?’后面代碼,為nil時(shí)不執(zhí)行’?’后面的代碼;如果是賦值的時(shí)候使用,則意味著這個(gè)常量、變量可能為有值或nil。
- **!**:不管’!’前有值還是nil,都執(zhí)行‘!’后面的代碼,你可以理解為強(qiáng)制調(diào)用;如果是賦值的時(shí)候使用,則意味著這個(gè)常量、變量一定有值。
‘!’要慎重使用,不然會(huì)引起程序崩潰,app閃退。
這里設(shè)計(jì)兩個(gè)類:
~~~
class Residence {
var numberOfRooms = 1
}
class Person {
// 可選屬性,可能為nil或Residence類
var residence: Residence?
}
~~~
在Person中有個(gè)引用類型的屬性residence,這個(gè)屬性可以是nil也可以是Residence類,這就是一個(gè)可選屬性。
下面給大家介紹可選鏈的使用。
### 可選獲得
~~~
let john = Person()
john.residence = Residence()
// 可選獲得
var roomCount = john.residence?.numberOfRooms
~~~
### 強(qiáng)制獲得
如果你已經(jīng)確定這個(gè)屬性有值是,你可以使用‘!’強(qiáng)制獲得。
~~~
// 強(qiáng)制獲得
roomCount = john.residence!.numberOfRooms
print(roomCount) // Optional(1) Optional代表可選
~~~
### if獲得
在上面兩種方式都比較麻煩,第一種方式,當(dāng)你去使用的時(shí)候,你還需要去if判斷;第二種方式,不是每一次都能強(qiáng)制調(diào)用成功的,當(dāng)為nil時(shí)強(qiáng)制調(diào)用,會(huì)引起程序崩潰。處于這種情況,我們可以結(jié)合if使用更優(yōu)雅的方式獲得。
~~~
// if獲得
if let roomCount = john.residence?.numberOfRooms {
print(roomCount) // 1
}
~~~
## 其他
### 參考資料
[The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)
### 文檔修改記錄
| 時(shí)間 | 描述 |
|-----|-----|
| 2015-11-1 | 根據(jù) [The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)中的Optional Chaining總結(jié) |
版權(quán)所有:[http://blog.csdn.net/y550918116j](http://blog.csdn.net/y550918116j)
- 前言
- Swift函數(shù)
- Swift閉包(Closures)
- Swift枚舉(Enumerations)
- Swift類和結(jié)構(gòu)體(Classes and Structures)
- Swift屬性(Properties)
- Swift方法(Methods)
- Swift下標(biāo)(Subscripts)
- Swift繼承(Inheritance)
- Swift初始化(Initialization)
- Swift銷毀(Deinitialization)
- Swift可選鏈(Optional Chaining)
- Swift錯(cuò)誤處理(Error Handling)
- Swift類型選擇(Type Casting)
- Swift協(xié)議(Protocols)
- Swift訪問控制(Access Control)
- Swift高級(jí)運(yùn)算符(Advanced Operators)
