沒有 Optional 的世界,必須特別定義“什麼”表示變數未初始化狀態,這個約定必須人為維護,不但編譯器無法幫忙檢查,開發者間也容易產生誤解。
var age:Int = -1 //年齡未定義,還是-1歲?!
?
表示變數是個 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!)") //不會執行
}
先判斷是否為nil
,再用!
取值方式太囉唆,判斷取值技巧將兩步驟合而為一。
var age: Int? = 20
if let ageNum = age {
println("age=\(ageNum)") //output: age=20
}
age
有值,得到ageNum=20
型別為Int
,不需再透過!
強制解開包裝。age
無值,{}
內程式不會被執行。!
表示變數(常數)是 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