iOS 開發 -- Swift 語法篇 (二) 可選項
阿新 • • 發佈:2019-01-09
Optional
是 Swift 的一大特色,也是 Swift 初學者最容易困惑的問題- 定義變數時,如果指定是
可選的
,表示該變數可以有一個指定型別的值,也可以是 nil
- 定義變數時,在型別後面新增一個
?
,表示該變數是可選的 - 變數可選項的預設值是
nil
- 常量可選項沒有預設值,主要用於在建構函式中給常量設定初始數值
// Optional 可能有兩個值 (None / Some)
// 格式(1. 自動推導):var 變數名: Optional = 值
let x: Optional = 20
// 格式(2. 指定型別):var 變數
let y: Optional<Int> = 30
// 格式(3. 簡化格式):var 變數名: 型別? = 值
let z: Int? = 10
// 可選值在參與計算前,必須`解包 unwarping`
// 只有`解包(unwrap)`後才能參與計算
// 在變數後新增一個 `!`,可以強行解包
// `?` 是用於定義的
// `!` 是用於解包的,程式設計師要對每一個 `!` 負責
print(x! + y! + z!)
- 如果 Optional 值是
nil
,不允許參與計算 - 只有
解包(unwrap)
後才能參與計算 - 在變數後新增一個
!
,可以強行解包
注意:必須要確保解包後的值不是 nil,否則會報錯
// 常量可選項必須要設定初始值
let x: Int? //= 20
x = 20
// 變數可選項預設值是 nil
var y: Int ? //= 10
y = 20
// 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 = 20
print((x ?? 0) + (y ?? 0))
注意:
??
的優先順序低,在使用時,應該注意使用()
var str: String? = "老王"
// 注意 `??` 的優先順序低,在使用時,應該注意使用 `()`
print((str ?? "無名") + " 你好")
print(str ?? "無名" + " 你好")