[APP開發-使用Swift] 觀念介紹: Optionals

Chiwen Lai
4 min readSep 30, 2017

--

我們在8. UIAlertController 與Table View互動裡有一段程式碼將表格加上打勾的功能,裡面的cell加上了問號,這是什麼呢?

let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryType = .checkmark

試著把問號拿掉看看,哎呀!出錯了!用option+click點選cell,發現cell的型別是UITableViewCell?,為什麼多一個問號呢?

我們在觀念介紹:Class、Object中用了Person這個Class來做說明,接下來讓我們繼續延續Person這個例子來討論Optionals。

讓我們加入Dog這個Class來與Person互動:

class Dog {
var name: String
var age: Int
var breed: String
init(name: String, age: Int, breed: String) {
self.name = name
self.age = age
self.breed = breed
}
}

宣告一個物件snoopy,是一隻叫做Snoopy的三歲米格魯犬。

let snoopy = Dog(name: “Snoopy”, age: 3, breed: “beagle”)

Person可以養狗作為寵物,可是並不是人人都有養狗。所以我們將人加上一個pet的屬性,屬於Dog?這個型態。Dog加上問號,這是什麼?這就是我們說的optional屬性。因為Optional是允許nil值的型態,所以我們完全不需要修改init這個初始化的事件,人可以有狗,也可以沒有狗。

Unwrapping Optionals

Optionals就像一個盒子,裡面可能有東西,也可能沒有,假設每個人在聖誕節都獲得了一個禮物包裝的盒子,但裡面只有一個盒子真正裝有一隻小狗Snoopy,其他都是空的,Charlie很幸運地獲得了這個裝有小狗Snoopy的盒子。我們用問號表示Optional型別,用驚嘆號表示Unwrapping Optionals,把盒子打開直接取值。

事不宜遲,Charlie馬上想帶著Snoopy出去遛狗,順便炫耀一番。我們在Person這個class加上walkDog這個function,用self.pet!.name,就可以帶著狗狗出門了!

執行看看

發生致命的錯誤!!!為什麼?我們忘了一件事,Charlie和Snoopy到目前為止還沒有碰在一起,所以Snoopy還不是Charlie的狗,記得加上charlie.pet = snoopy,執行!

Optional Binding

不過Tom與Mary沒有養狗做寵物怎麼辦?他們兩位只要執行walkDog()這個方法,程式依然會發生致命的錯誤。這時候我們需要Optional Binding。看下面的程式碼,拆開箱子後,利用if let語法把pet丟給unwrappedPet判斷裡面是否有值,有值的話才出門遛狗,這樣是不是合理多了呢?!

執行看看!

Optional Chaining

為了讓程式碼更簡潔,我們也可以直接利用Optional Chaining的方法,取用寵物的名稱,self.pet?.name就可以判斷pet有值再取,是不是也很方便呢?

--

--