# Swift 可選(Optionals)類型
Swift 的可選(Optional)類型,用于處理值缺失的情況。可選表示"那兒有一個值,并且它等于 x "或者"那兒沒有值"。
Swfit語言定義后綴?作為命名類型Optional的簡寫,換句話說,以下兩種聲明是相等的:
```
var optionalInteger: Int?
var optionalInteger: Optional<Int>
```
在這兩種情況下,變量optionalInteger都是可選整數類型。注意,在類型和?之間沒有空格。
Optional 是一個含有兩種情況的枚舉,None和Some(T),用來表示可能有或可能沒有值。任何類型都可以明確聲明為(或者隱式轉換)可選類型。當聲明一個可選類型的時候,要確保用括號給?操作符一個合適的范圍。例如,聲明可選整數數組,應該寫成(Int[])?;寫成Int[]?會報錯。
當你聲明一個可選變量或者可選屬性的時候沒有提供初始值,它的值會默認為nil。
可選項遵照LogicValue協議,因此可以出現在布爾環境中。在這種情況下,如果可選類型T?包含類型為T的任何值(也就是說它的值是Optional.Some(T)),這個可選類型等于true,反之為false。
如果一個可選類型的實例包含一個值,你可以用后綴操作符 !來訪問這個值,如下所示:
```
optionalInteger = 42
optionalInteger! // 42
```
使用操作符!去獲取值為nil的可選變量會有運行時錯誤。
你可以用可選鏈接和可選綁定選擇性執行可選表達式上的操作。如果值為nil,任何操作都不會執行,也不會有運行報錯。
讓我們來詳細看下以下實例來了解 Swift 中可選類型的應用:
```
import Cocoa
var myString:String? = nil
if myString != nil {
print(myString)
}else{
print("字符串為 nil")
}
```
以上程序執行結果為:
```
字符串為 nil
```
可選類型類似于Objective-C中指針的nil值,但是nil只對類(class)有用,而可選類型對所有的類型都可用,并且更安全。
## 強制解析
當你確定可選類型確實包含值之后,你可以在可選的名字后面加一個感嘆號(!)來獲取值。這個感嘆號表示"我知道這個可選有值,請使用它。"這被稱為可選值的強制解析(forced unwrapping)。
實例如下:
```
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
print(myString)
}else{
print("myString 值為 nil")
}
```
以上程序執行結果為:
```
Optional("Hello, Swift!")
```
強制解析可選值,使用感嘆號(!):
```
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
// 強制解析
print( myString! )
}else{
print("myString 值為 nil")
}
```
以上程序執行結果為:
```
Hello, Swift!
```
> 注意:
> 使用`!`來獲取一個不存在的可選值會導致運行時錯誤。使用`!`來強制解析值之前,一定要確定可選包含一個非`nil`的值。
## 自動解析
你可以在聲明可選變量時使用感嘆號(!)替換問號(?)。這樣可選變量在使用時就不需要再加一個感嘆號(!)來獲取值,它會自動解析。
實例如下:
```
import Cocoa
var myString:String!
myString = "Hello, Swift!"
if myString != nil {
print(myString)
}else{
print("myString 值為 nil")
}
```
以上程序執行結果為:
```
Hello, Swift!
```
## 可選綁定
使用可選綁定(optional binding)來判斷可選類型是否包含值,如果包含就把值賦給一個臨時常量或者變量。可選綁定可以用在if和while語句中來對可選類型的值進行判斷并把值賦給一個常量或者變量。
像下面這樣在if語句中寫一個可選綁定:
```
if let constantName = someOptional {
statements
}
```
讓我們來看下一個簡單的可選綁定實例:
```
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if let yourString = myString {
print("你的字符串值為 - \(yourString)")
}else{
print("你的字符串沒有值")
}
```
以上程序執行結果為:
```
你的字符串值為 - Hello, Swift!
```
- Swift 簡介
- Swift 環境搭建
- Swift 基本語法
- Swift 數據類型
- Swift 變量
- Swift 可選(Optionals)類型
- Swift 常量
- Swift 字面量
- Swift 運算符
- Swift 條件語句
- Swift if 語句
- Swift if...else 語句
- Swift if...else if...else 語句
- Swift 嵌套 if 語句
- Swift switch 語句
- Swift 循環
- Swift for-in 循環
- Swift for 循環
- Swift While 循環
- Swift repeat...while 循環
- Swift Continue 語句
- Swift Break 語句
- Swift Fallthrough 語句
- Swift 字符串
- Swift 字符(Character)
- Swift 數組
- Swift 字典
- Swift 函數
- Swift 閉包
- Swift 枚舉
- Swift 結構體
- Swift 類
- Swift 屬性
- Swift 方法
- Swift 下標腳本
- Swift 繼承
- Swift 構造過程
- Swift 析構過程
- Swift 可選鏈
- Swift 自動引用計數(ARC)
- Swift 類型轉換
- Swift 擴展
- Swift 協議
- Swift 泛型
- Swift 訪問控制