#4 怦然心動的資料整理魔法—使用 Dictionary

前言

程式碼需要整理嗎?通常這個問題問巴黎人的時候,心裡都會出現兩種聲音—其一:「程式不會壞就好,何必管那麼多呢?」,其二:「整理得乾淨好閱讀,對團隊成員也比較好啊!」,於是一邊寫程式的過程中腦內不斷上演戰爭,正反面的想法不斷地相互辯論。但有時候會因為懶惰就默許未整理的程式碼留在 repository 裡。

然而工作期間遇到了幾次 code review 的機會,與主管的幾番討論,依然還是得到“程式碼整理過比較好維護”的結論,尤其下一次自己來閱讀的時候,掌握狀況的速度就會變快許多。

今天就讓我們用 Dictionary 來小試身手吧!來體會什麼是怦然心動的資料整理魔法。

Dictionary 簡述

Dictionary 是 Swift 中一個常用的資料結構,用於儲存一組鍵值對(Key-Value pairs)的資料。每個鍵對應到一個值,使用時可以根據鍵來快速存取對應的值。以下是一個簡單的 Dictionary

var capitalCity = ["Nepal": "Kathmandu", "Italy": "Rome", "England": "London"]
print(capitalCity)

當我們觀察 Dictionary 的結構時,會發現它長得跟 Array 很像,下面讓我們來比較一下兩者的不同:

Array 是一個有序的資料集合,其內容須同一型別。我們可以用其 index 來存取元素。index 值是由 0 開始。

var numbers : [Int] = [2, 4, 6, 8]
print(numbers[1]) // 4
// 新增一個元素
numbers.append(10)

Dictionary 是一個無序的資料集合,其資料的儲存方式為 key-value pairs,value 須為同一型別,key 則是使用字串即可,但 key 值需要是唯一的。我們可以用其 key 值來存取元素。

var capitalCity : [String : String] = ["Nepal": "Kathmandu", "Italy": "Rome", "England": "London"]
print(capitalCity["Italy"]!) // Rome
// 新增一對 key-value
capitalCity["Taiwan"] = "Taipei"

那我們什麼時候該使用 Array,什麼時候該使用 Dictionary 呢?不妨先看一下這個例子:

今天上英語課,劉老師上課前都會先點名,老師依學生名冊唱名:「 1 號:王小明,2 號 陳小美,3 號:…. 」。

接著老師請英文小老師陳小美為大家唸一段課文;英文小老師發音很標準,讓大家學習到很多。

看出來了嗎?這邊的“學生名冊”就是一種 Array 的形式,而老師請陳小美來唸課文,則是使用了 Dictionary的能力,我們可以推測老師心裡有一個這樣的 Dictionary

[
"英文小老師" : "陳小美",
"班長" : "王小明",
"搗蛋鬼" : "李大頭"
]

所以當我們有一組資料,且十分在乎其順序性時,這時我們就用 Array 來乘載他們,就像上述的“學生名冊”。

而當我們有一組資料,而不在乎其元素之順序,但我們需要用其 key 值快速查找,這時就需要使用 Dictionary,就像上述點名“英文小老師”那樣。

我不能使用 Array 乘載無順序的資料嗎?

當然可以啊!只不過當我們要找到特定資料時,因為沒有 key ,就必須使用迴圈一個一個比較,這時使用 Dictionary 的效率是明顯高於 Array 的。

怦然心動的資料整理魔法

使用 Ditionary 來整理 Switch

我們可能會有下列 Switch 程式碼區塊,就好比用一個 key 去取得一個 value,這樣可以當作一個 Dictionary 來看。

func callStudent(_ title: String = "班長") -> String {
var student : String = ""
switch (title) {
case "英文小老師":
student = "陳小美"
case "班長":
student = "王小明"
case "搗蛋鬼":
student = "李大頭"
default:
break
}

return student
}

callStudent()

讓我們來施展怦然心動的整理魔法吧!霹靂卡霹靂拉拉 波波力那貝貝魯多~

整理完後變成這樣:

func callStudent(_ title: String = "班長") -> String {
var students : [String : String] = [
"英文小老師" : "陳小美",
"班長" : "王小明",
"搗蛋鬼" : "李大頭"
]

if let student = students[title] {
return student;
}

return ""
}

callStudent()

修改後程式碼清楚不少,而且需要擴充時,只要增加一個 key-value 就好了呢!

結論

這個整理魔法真的很好用呢,屢試不爽。如果整理得不好,那麼只要多念幾次咒語就好了。

目前我們已有累積一位信眾:

--

--