close

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)

 

 

arrow
arrow
    全站熱搜

    Eason 發表在 痞客邦 留言(0) 人氣()