iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

iOS 新手開發的大小事系列 第 6

Day 6: [Swift] 可選型別 (Optional)

前言

剛開始在接觸 iOS 開發的時候,時常看到一堆驚嘆號跟問號,當時翻書或問人,就只得到這是 “optional” 的答案,於是就把這疑問存在心裡,直到現在,終於有機會把可選型別 (optional) 好好的弄懂一番了,如果對於 optional 仍有疑問的開發新手,希望這篇文章能夠對大家有所幫助。


進入主題

Swift 是強型別的語言,在一開始設置常數或變數的時候,就必須給定初始值,或是使用 optional 型別,而 optional 型別指的是兩種可能,一種是有值,另一種為空值 (nil)。因為 Swift 在設計時就以減少 crash 目的出發,所以要求設計者使用 optional 設計,降低 app crash 的可能性。

設置變數只會出現以下兩種狀況:

  1. 給定初始值
var number: Int = 0
  1. 設定為 optional 型別
var number: Int?

Optional 的狀態可想成將變數包裝起來,在未拆開前,並不知道裡面是有值或是空值的狀態。


解包 (Unwrapping)

當我們需要使用 optional 時就必須拆開包裝,實際的做法有三種:

  1. 強制解包 "!"
  2. if 解包
  3. if let / guard let 解包

強制解包

var number: Int?
number = 10
print(number!)
// Prints 10

強制解包使用方式只要在變數後面加上驚嘆號就可以了,但這種方式並不安全,如果 number 為 nil,在第三行印出值時就會造成運行錯誤。為了避免這種狀況出現,所以我們可以使用 if 解包,來增加安全性。

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 解包。

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."

以上這兩種解包的方式,直接在判斷式創造一個新的常數,用新常數來判定可選型別是否為空值,是個簡約又安全的做法。


上一篇
Day 5: [Swift] 列舉 (Enumerations) -2
下一篇
Day 7: [Swift] 可選鏈 (Optional Chaining)
系列文
iOS 新手開發的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言