剛開始在接觸 iOS 開發的時候,時常看到一堆驚嘆號跟問號,當時翻書或問人,就只得到這是 “optional” 的答案,於是就把這疑問存在心裡,直到現在,終於有機會把可選型別 (optional) 好好的弄懂一番了,如果對於 optional 仍有疑問的開發新手,希望這篇文章能夠對大家有所幫助。
Swift 是強型別的語言,在一開始設置常數或變數的時候,就必須給定初始值,或是使用 optional 型別,而 optional 型別指的是兩種可能,一種是有值,另一種為空值 (nil)。因為 Swift 在設計時就以減少 crash 目的出發,所以要求設計者使用 optional 設計,降低 app crash 的可能性。
設置變數只會出現以下兩種狀況:
var number: Int = 0
var number: Int?
Optional 的狀態可想成將變數包裝起來,在未拆開前,並不知道裡面是有值或是空值的狀態。
當我們需要使用 optional 時就必須拆開包裝,實際的做法有三種:
var number: Int?
number = 10
print(number!)
// Prints 10
強制解包使用方式只要在變數後面加上驚嘆號就可以了,但這種方式並不安全,如果 number 為 nil,在第三行印出值時就會造成運行錯誤。為了避免這種狀況出現,所以我們可以使用 if 解包,來增加安全性。
var number: Int?
number = 10
if number != nil {
print("The number is \(number!).")
// Prints "The number is 10."
}
var number: Int?
number = 10
if number != nil {
let newNumber = number
print("The number is \(newNumber).")
// Prints "The number is 10."
}
有兩種做法,第一種是先用 if 判定變數 number
是否為空值,如不為空值,則可強制解包,第二種做法為,判定number
不為空值後,將 number
指定給一個新常數 newNumber
,則可確定新常數不為空值,列印出新常數。而在 Swift 語法中,提供了更加簡約的解包方法,即使用 if let / guard let 解包。
var number: Int?
number = 10
if let newNumber = number {
print("The number is \(newNumber).")
// Prints "The number is 10."
}
func showNumber(_ number: Int?) {
guard let newNumber = number else { return }
print("The number is \(newNumber).")
}
showNumber(10)
// Prints "The number is 10."
以上這兩種解包的方式,直接在判斷式創造一個新的常數,用新常數來判定可選型別是否為空值,是個簡約又安全的做法。