1. 程式人生 > >iOS 開發 -- Swift 語法篇 (二) 可選項

iOS 開發 -- Swift 語法篇 (二) 可選項

  • 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 ?? "無名" + " 你好")