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