字典
字典是一種存儲相同類型多重數據的存儲器。每個值(value)都關聯獨特的鍵(key),鍵作爲字典中的這個值數據的標識符。和數組中的數據項不同,字典中的數據項並沒有具體順序。我們在需要通過標識符(鍵)訪問數據的時候使用字典,這種方法很大程度上和我們在現實世界中使用字典查字義的方法一樣。
Swift 的字典使用時需要具體規定可以存儲鍵和值類型。不同於 Objective-C 的NSDictionary 和NSMutableDictionary 類可以使用任何類型的對象來作鍵和值並且不提供任何關於這些對象的本質信息。在 Swift 中,在某個特定字典中可以存儲的鍵和值必須提前定義清楚,方法是通過顯性類型標註或者類型推斷。
Swift 的字典使用 Dictionary<KeyType, ValueType>定義,其中 KeyType 是字典中鍵的數據類型,ValueType 是字典中對應於這些鍵所存儲值的數據類型。
字典字面語句
我們可以使用字典字面語句來構造字典,他們和我們剛纔介紹過的數組字面語句擁有相似語法。一個字典字面語句是一個定義擁有一個或者多個鍵值對的字典集合的簡單語句。
一個鍵值對是一個 key 和一個 value 的結合體。在字典字面語句中,每一個鍵值對的鍵和值都由冒號分割。這些鍵值對構成一個列表,其中這些鍵值對由方括號包含並且由逗號分割:
1. [key 1: value 1, key 2: value 2, key 3: value 3]
下面的例子創建了一個存儲國際機場名稱的字典。在這個字典中鍵是三個字母的國際航空運輸相關代碼,值是機場名稱:
1. var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
airports 字典被定義爲一種 Dictionary<String, String>,它意味着這個字典的鍵和值都是String 類型。
注意: airports 字典被聲明爲變量(用 var 關鍵字)而不是常量(let 關鍵字)因爲後來更多的機場信息會被添加到這個示例字典中。
和數組一樣,如果我們使用字面語句構造字典就不用把類型定義清楚。airports 的也可以用這種方法簡短定義:
1. var airports = ["TYO": "Tokyo", "DUB": "Dublin"]
因爲這個語句中所有的鍵和值都分別是相同的數據類型,Swift 可以推斷出Dictionary<String, String>是 airports 字典的正確類型。
讀取和修改字典
我們可以通過字典的方法和屬性來讀取和修改字典,或者使用下標語法。和數組一樣,我們可以通過字典的只讀屬性 count 來獲取某個字典的數據項數量:
1. println("The dictionary of airports contains \(airports.count) items.")
2. // 打印 "The dictionary of airports contains 2 items."(這個字典有兩個數據項)
我們也可以在字典中使用下標語法來添加新的數據項。可以使用一個合適類型的 key 作爲下標索引,並且分配新的合適類型的值:
1. airports["LHR"] = "London"
2. // airports 字典現在有三個數據項 我們也可以使用下標語法來改變特定鍵對應的值:
1. airports["LHR"] = "London Heathrow"
2. // "LHR"對應的值 被改爲 "London Heathrow
1. if let oldValue = airports.updateValue("Dublin Internation", forKey: "
DUB") {
2. println("The old value for DUB was \(oldValue).")
3. }
4. // 打印出 "The old value for DUB was Dublin."(dub原值是 dublin)
我們也可以使用下標語法來在字典中檢索特定鍵對應的值。由於使用一個沒有值的鍵這種情況是有可能發生的,可選 類型返回這個鍵存在的相關值,否則就返回 nil:
1. if let airportName = airports["DUB"] {
2. println("The name of the airport is \(airportName).")
3. } else {
4. println("That airport is not in the airports dictionary.")
5. }
1. airports["APL"] = "Apple Internation"
2. // "Apple Internation"不是真的 APL機場, 刪除它
3. airports["APL"] = nil
4. // APL現在被移除了
另外,removeValueForKey 方法也可以用來在字典中移除鍵值對。這個方法在鍵值對存在的情況下會移除該鍵值對並且返回被移除的 value 或者在沒有值的情況下返回 nil:
1. if let removedValue = airports.removeValueForKey("DUB") {
2. println("The removed airport's name is \(removedValue).")
3. } else {
4. println("The airports dictionary does not contain a value for DUB.
")
5. }
6. // 打印 "The removed airport's name is Dublin International."(被移除的機場名字是都柏林國際)
我們可以使用 for-in 循環來遍歷某個字典中的鍵值對。每一個字典中的數據項都由(key,
value)元組形式返回,並且我們可以使用暫時性常量或者變量來分解這些元組:
1. for (airportCode, airportName) in airports {
2. prINTln("\(airportCode): \(airportName)")
3. }
4. // TYO: Tokyo
5. // LHR: London Heathrow
我們也可以通過訪問他的 keys 或者 values 屬性(都是可遍歷集合)檢索一個字典的鍵或者值:
1. for airportCode in airports.keys {
2. prINTln("Airport code: \(airportCode)")
3. }
4. // Airport code: TYO
5. // Airport code: LHR
6.
7. for airportName in airports.values {
8. prINTln("Airport name: \(airportName)")
9. }
10. // Airport name: Tokyo
11. // Airport name: London Heathrow
如果我們只是需要使用某個字典的鍵集合或者值集合來作爲某個接受 Array 實例 API 的參數,可以直接使用 keys 或者 values 屬性直接構造一個新數組:
1. let airportCodes = Array(airports.keys)
2. // airportCodes is ["TYO", "LHR"]
3.
4. let airportNames = Array(airports.values)
5. // airportNames is ["Tokyo", "London Heathrow"]
注意: Swift 的字典類型是無序集合類型。其中字典鍵,值,鍵值對在遍歷的時候會重新排列,而且其中順序是不固定的。
創建一個空字典
我們可以像數組一樣使用構造語法創建一個空字典:
1. var namesOfIntegers = Dictionary<Int, String>()
2. // namesOfIntegers 是一個空的 Dictionary<Int, String>
這個例子創建了一個 Int, String 類型的空字典來儲存英語對整數的命名。他的鍵是 Int 型,值是 String 型。
如果上下文已經提供了信息類型,我們可以使用空字典字面語句來創建一個空字典,記作[:](中括號中放一個冒號):
1. namesOfIntegers[16] = "sixteen"
2. // namesOfIntegers 現在包含一個鍵值對
3. namesOfIntegers = [:]
4. // namesOfIntegers 又成爲了一個 Int, String類型的空字典
字典是一種存儲相同類型多重數據的存儲器。每個值(value)都關聯獨特的鍵(key),鍵作爲字典中的這個值數據的標識符。和數組中的數據項不同,字典中的數據項並沒有具體順序。我們在需要通過標識符(鍵)訪問數據的時候使用字典,這種方法很大程度上和我們在現實世界中使用字典查字義的方法一樣。
Swift 的字典使用時需要具體規定可以存儲鍵和值類型。不同於 Objective-C 的NSDictionary 和NSMutableDictionary 類可以使用任何類型的對象來作鍵和值並且不提供任何關於這些對象的本質信息。在 Swift 中,在某個特定字典中可以存儲的鍵和值必須提前定義清楚,方法是通過顯性類型標註或者類型推斷。
Swift 的字典使用 Dictionary<KeyType, ValueType>定義,其中 KeyType 是字典中鍵的數據類型,ValueType 是字典中對應於這些鍵所存儲值的數據類型。
字典字面語句
我們可以使用字典字面語句來構造字典,他們和我們剛纔介紹過的數組字面語句擁有相似語法。一個字典字面語句是一個定義擁有一個或者多個鍵值對的字典集合的簡單語句。
一個鍵值對是一個 key 和一個 value 的結合體。在字典字面語句中,每一個鍵值對的鍵和值都由冒號分割。這些鍵值對構成一個列表,其中這些鍵值對由方括號包含並且由逗號分割:
1. [key 1: value 1, key 2: value 2, key 3: value 3]
下面的例子創建了一個存儲國際機場名稱的字典。在這個字典中鍵是三個字母的國際航空運輸相關代碼,值是機場名稱:
1. var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
airports 字典被定義爲一種 Dictionary<String, String>,它意味着這個字典的鍵和值都是String 類型。
注意: airports 字典被聲明爲變量(用 var 關鍵字)而不是常量(let 關鍵字)因爲後來更多的機場信息會被添加到這個示例字典中。
和數組一樣,如果我們使用字面語句構造字典就不用把類型定義清楚。airports 的也可以用這種方法簡短定義:
1. var airports = ["TYO": "Tokyo", "DUB": "Dublin"]
因爲這個語句中所有的鍵和值都分別是相同的數據類型,Swift 可以推斷出Dictionary<String, String>是 airports 字典的正確類型。
讀取和修改字典
我們可以通過字典的方法和屬性來讀取和修改字典,或者使用下標語法。和數組一樣,我們可以通過字典的只讀屬性 count 來獲取某個字典的數據項數量:
1. println("The dictionary of airports contains \(airports.count) items.")
2. // 打印 "The dictionary of airports contains 2 items."(這個字典有兩個數據項)
我們也可以在字典中使用下標語法來添加新的數據項。可以使用一個合適類型的 key 作爲下標索引,並且分配新的合適類型的值:
1. airports["LHR"] = "London"
2. // airports 字典現在有三個數據項 我們也可以使用下標語法來改變特定鍵對應的值:
1. airports["LHR"] = "London Heathrow"
2. // "LHR"對應的值 被改爲 "London Heathrow
作爲另一種下標方法,字典的updateValue(forKey:)方法可以設置或者更新特定鍵對應的值。就像上面所示的示例,updateValue(forKey:)方法在這個鍵不存在對應值的時候設置值或者在存在時更新已存在的值。和上面的下標方法不一樣,這個方法返回更新值之前的原值。這樣方便我們檢查更新是否成功。
updateValue(forKey:)函數會返回包含一個字典值類型的可選值。舉例來說:對於存儲 String值的字典,這個函數會返回一個 String?或者“可選 String”類型的值。如果值存在,則這個可選值值等於被替換的值,否則將會是 nil。1. if let oldValue = airports.updateValue("Dublin Internation", forKey: "
DUB") {
2. println("The old value for DUB was \(oldValue).")
3. }
4. // 打印出 "The old value for DUB was Dublin."(dub原值是 dublin)
我們也可以使用下標語法來在字典中檢索特定鍵對應的值。由於使用一個沒有值的鍵這種情況是有可能發生的,可選 類型返回這個鍵存在的相關值,否則就返回 nil:
1. if let airportName = airports["DUB"] {
2. println("The name of the airport is \(airportName).")
3. } else {
4. println("That airport is not in the airports dictionary.")
5. }
6. // 打印 "The name of the airport is Dublin INTernation."(機場的名字是都柏林國際)
我們還可以使用下標語法來通過給某個鍵的對應值賦值爲 nil 來從字典裏移除一個鍵值對:
1. airports["APL"] = "Apple Internation"
2. // "Apple Internation"不是真的 APL機場, 刪除它
3. airports["APL"] = nil
4. // APL現在被移除了
另外,removeValueForKey 方法也可以用來在字典中移除鍵值對。這個方法在鍵值對存在的情況下會移除該鍵值對並且返回被移除的 value 或者在沒有值的情況下返回 nil:
1. if let removedValue = airports.removeValueForKey("DUB") {
2. println("The removed airport's name is \(removedValue).")
3. } else {
4. println("The airports dictionary does not contain a value for DUB.
")
5. }
6. // 打印 "The removed airport's name is Dublin International."(被移除的機場名字是都柏林國際)
我們可以使用 for-in 循環來遍歷某個字典中的鍵值對。每一個字典中的數據項都由(key,
value)元組形式返回,並且我們可以使用暫時性常量或者變量來分解這些元組:
1. for (airportCode, airportName) in airports {
2. prINTln("\(airportCode): \(airportName)")
3. }
4. // TYO: Tokyo
5. // LHR: London Heathrow
我們也可以通過訪問他的 keys 或者 values 屬性(都是可遍歷集合)檢索一個字典的鍵或者值:
1. for airportCode in airports.keys {
2. prINTln("Airport code: \(airportCode)")
3. }
4. // Airport code: TYO
5. // Airport code: LHR
6.
7. for airportName in airports.values {
8. prINTln("Airport name: \(airportName)")
9. }
10. // Airport name: Tokyo
11. // Airport name: London Heathrow
如果我們只是需要使用某個字典的鍵集合或者值集合來作爲某個接受 Array 實例 API 的參數,可以直接使用 keys 或者 values 屬性直接構造一個新數組:
1. let airportCodes = Array(airports.keys)
2. // airportCodes is ["TYO", "LHR"]
3.
4. let airportNames = Array(airports.values)
5. // airportNames is ["Tokyo", "London Heathrow"]
注意: Swift 的字典類型是無序集合類型。其中字典鍵,值,鍵值對在遍歷的時候會重新排列,而且其中順序是不固定的。
創建一個空字典
我們可以像數組一樣使用構造語法創建一個空字典:
1. var namesOfIntegers = Dictionary<Int, String>()
2. // namesOfIntegers 是一個空的 Dictionary<Int, String>
這個例子創建了一個 Int, String 類型的空字典來儲存英語對整數的命名。他的鍵是 Int 型,值是 String 型。
如果上下文已經提供了信息類型,我們可以使用空字典字面語句來創建一個空字典,記作[:](中括號中放一個冒號):
1. namesOfIntegers[16] = "sixteen"
2. // namesOfIntegers 現在包含一個鍵值對
3. namesOfIntegers = [:]
4. // namesOfIntegers 又成爲了一個 Int, String類型的空字典