-
是 Swift 的一大特色,也是 Swift 初學者最容易困惑的問題Optional
- 定義變量時,如果指定是
,表示該變量可選的
可以有一個指定類型的值,也可以是 nil
- 定義變量時,在類型後面添加一個
,表示該變量是可選的?
- 變量可選項的預設值是
nil
- 常量可選項沒有預設值,主要用于在構造函數中給常量設定初始數值
// Optional 可能有兩個值 (None / Some)
// 格式(1. 自動推導):var 變量名: Optional = 值
let x: Optional =
// 格式(2. 指定類型):var 變量
let y: Optional<Int> =
// 格式(3. 簡化格式):var 變量名: 類型? = 值
let z: Int? =
// 可選值在參與計算前,必須`解包 unwarping`
// 隻有`解包(unwrap)`後才能參與計算
// 在變量後添加一個 `!`,可以強行解包
// `?` 是用于定義的
// `!` 是用于解包的,程式員要對每一個 `!` 負責
print(x! + y! + z!)
- 如果 Optional 值是
,不允許參與計算nil
- 隻有
後才能參與計算解包(unwrap)
- 在變量後添加一個
,可以強行解包!
注意:必須要確定解包後的值不是 nil,否則會報錯
// 常量可選項必須要設定初始值
let x: Int? //= 20
x =
// 變量可選項預設值是 nil
var y: Int? //= 10
y =
// unexpectedly found nil while unwrapping an Optional value
// 在對可選項解包時發現 nil,會報錯!
if y == nil {
print("y值為 nil")
} else {
print(x! + y!)
}
常見錯誤
unexpectedly found nil while unwrapping an Optional value
翻譯
在對可選項[解包]時發現 nil
??
運算符
??
-
運算符可以用于判斷??
的數值是否是變量/常量
,如果是則使用後面的值替代nil
- 在使用 Swift 開發時,
能夠簡化代碼的編寫??
// 常量可選項必須要設定初始值
var x: Int? //= 20
// x = 30
// 變量可選項預設值是 nil
var y: Int? //= 10
y =
print((x ?? ) + (y ?? ))
注意:的優先級低,在使用時,應該注意使用
??
()
var str: String? = "老王"
// 注意 `??` 的優先級低,在使用時,應該注意使用 `()`
print((str ?? "無名") + " 你好")
print(str ?? "無名" + " 你好")