Swift 學習筆記

Optional

宣告、設定與讀取

沒有 Optional 的世界,必須特別定義“什麼”表示變數未初始化狀態,這個約定必須人為維護,不但編譯器無法幫忙檢查,開發者間也容易產生誤解。

var age:Int = -1  //年齡未定義,還是-1歲?!

宣告

  • Optional 是個包裝型別的容器,有兩種狀態:一個是空無一物、一個就是型別的值。
  • 型別後面加上問號?表示變數是個 Optional。型別與?間不可留空白。
  • Optional 預設值為nil,宣告後不賦值即設為預設值。
var age: Int?               //return: nil
var name: String? = nil        //return: nil

設定、讀取

  • 設定方式與一般賦值沒有差異。
  • 取值必須加上驚嘆號!,強制解開包裝(Force Unwrap)。
var age: Int? = 18
age = age! + 1

檢查是否有值

強制解開一個值為nil的 Optional,會讓程式爆炸。

var age: Int?
age = age! + 1  //fatal error: unexpectedly found nil while unwrapping an Optional value

Optional 取值前要先判斷是否為nil。

var age: Int?

if age != nil {
    println("age: \(age!)")     //不會執行
}

判斷取值 (Optional Binding)

先判斷是否為nil,再用!取值方式太囉唆,判斷取值技巧將兩步驟合而為一。

var age: Int? = 20

if let ageNum = age {
    println("age=\(ageNum)") //output: age=20
}
  • age有值,得到ageNum=20型別為Int,不需再透過!強制解開包裝。
  • age無值,{}內程式不會被執行。

自動取值 (Implicitly Unwrapped Optional)

  • 如果變數(常數)一旦給值後不會再變回無值的狀態,可以利用自動取值的方式宣告。
  • 型別宣告後面加上問號! 表示變數(常數)是 Implicitly Unwrapped Optional。
let name: String! = "Hugo"
var age: Int! = 18

age = age + 1
println("I'm \(name), \(age) years old.")   //output: I'm Hugo, 19 years old.

當然,如果欺騙程式,它會死給你看。

var age: Int! = nil
age = age + 1   //fatal error: unexpectedly found nil while unwrapping an Optional value

無值給預設值

若希望在 Optional 無值時給預設值,可用雙問號??後面加預設值,這應該是三元運算的語法糖。

var age: Int? = nil

var hisAge = age ?? 18
var herAge = age != nil ? age! : 18