Dictionaries
一個字典型態的常數/變數可以儲存由相同型態的keys跟相同型態的values所組成的關聯的集合,並且是沒有順序的。每一個值都會關聯到一個特定的key;就像真實世界的字典一樣,一個字所查詢到的只會是那個字所擁有的解釋。
有一點要注意的是,我們要拿來當作key的類別,一定都要有hash value,就跟Set要存進去的值一樣,才能在dictionary裡是唯一的。
在Swift裡,字典的宣告全名是:
Dictionary<key, value>
Swift提供了簡寫:
[key:value]
接下來我們先產生一個空的字典:
var namesOfIntegers = [Int: String]()
上面這行程式碼產生了由Int當key,String當value的字典。
這時我們先放一組值進去:
nameOfIntegers[16] = "sixteen"
// nameOfIntegers 這時就包含了一組key-value的值,其中key = 16, value = sixteen
nameOfIntegers = [:]
// 清空nameOfIntegers,對應到的key-value依然是Int-String
我們當然也可以宣告一個新的字典是有值的,格式如下:
[key1: value1, key2: value2, key3: value3]
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
上面這個機場的例子,我們產生了以機場簡寫為Key, 機場全名為Value的dictionary,其中key跟value的型態都是String
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
//跟Array一樣,Swift會自動判別型態,因此這行跟上面那行是一樣的結果
Accessing and Modifying a Dictionary
Swift內建一般方法可以讓我們讀取dictionary:
print("The airports dictionary contains \(airports.count) items.")
// The airports dictionary contains 2 items.
if airports.isEmpty {
print("Airport dictionary is empty")
} else {
print("Airport dictionary is not empty")
}
// Airport dictionary is not empty
我們可以插入一組新的key-value:
airports["LHR"] = "London"
當key值存在時,我們就是在更新這組key的值:
airports["LHR"] = "London Heathrow"
Swift還提供另一個方法:updateValue(_:forKey:)來更新值,不一樣的是他會回傳舊的value,讓我們可以運用:
if let oldValue = airports.updateValue("Dublin Airport", forKey:"DUB") {
print("The old value for DUB was \(oldValue)")
}
// The old vaule for DUB was Dublin
大家應該還記得,if的判斷是判斷布林值,也就是true or falue。在一般的宣告裡,並不會有回傳值:
let myNum = 1
但如果是Optional value的話,在宣告完成的時候他會有一個回傳值:若是宣告成功(不是nil),回傳true,宣告失敗(為nil),回傳false。
var myNum:Int? = 1
if let existNum = myNum {
print(existNum)
} else {
print("myNum is nil")
}
// print 1
一般來說我們不會做這麼拐彎抹角的事,但以dictionary來看,當我們用key做取值、更新或是刪除時,dictionary很有可能是沒有這組key-value的,因此Swift在做這些事時回傳的都是Optional value。也因此,我們可以藉由這個特性直接使用if做判斷;像上面的updateValue,即可判斷airports是否有DUB這個key,更新內容並印出更新前的值。
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName)")
} else {
print("not exist")
}
上例來看,我們取得了DUB key所對應到的value,並存在airportName裡。若是airports不存在DUB這個key,則印出not exist。
移除key-value的方式也有兩種:
airports["DUB"] = nil
或是
airports.removeValueForKey("DUB")
跟更新一樣,removeValueForKey會回傳被刪掉的value。
我們也可以用for-in loop 一次取得key跟value:
for (airportCode, airportName) in airports {
print("\(airportCode: \(airportName))")
}
Swift提供了.keys跟.values來直接取得所有的key或是value,回傳的型態是array;要注意的是,他們是沒有順序的。
for airportCode in airports.keys {
print(airportCode)
}
for airportName in airports.values {
print(airportName)
}
若我們需要另外處理key或是value的陣列,可用到之前所學的:
let airportCodes = [String](airports.keys)
let airportNames = [String](airports.values)