- 字典是無序的鍵值對集合
- 字典的鍵都是相同的類型,值也都是相同的類型。
- 字典的鍵key的類型必須是hashable的,也就是說實現了Hashable接口的類型。
- 如果字典中沒有這個key,那么查找這個key將會返回nil
創建字典
var namesAndScores = ["Anna": 2, "Brian": 2, "Craig": 8, "Donna": 6]
print(namesAndScores)
//> ["Craig": 8, "Anna": 2, "Donna": 6, "Brian": 2]
創建一個空的字典
var pairs: [String: Int] = [:]
注意:此處必須指明paris的數據類型,因為編譯器無法從空的字典判斷字典中內容的數據類型
一個小測試:
下面三個描述哪個是正確的?
1. let dict1: [Int, Int] = [:]
2. let dict2 = [:]
3. let dict3: [Int: Int] = [:]
第一個指定字典的鍵值對類型的時候錯誤,不能使用逗號而應該使用分號
第二個創建一個空字典必須指定鍵值對的類型,不能使用隱式的方法
第三個正確
獲取字典的值
- 使用角標
namesAndScores = ["Anna": 2, "Brian": 2, "Craig": 8, "Donna": 6]
// Restore the values
print(namesAndScores["Anna"])
// > Optional(2)
這里得到的值是一個可選類型。字典會先檢查是否有Anna這個key,如果有,返回值,否則返回nil
print(namesAndScores["Greg"])
// > nil
對于數組來說,角標越界會直接拋出運行時錯誤,而對于字典來說,結果都是可選類型。
- 使用字典的屬性和方法
namesAndScores.isEmpty // false
namesAndScores.count // 4
** 如果只是單純為了知道字典中是否含有元素,使用isEmpty比使用count更合適,使用count會去遍歷所有的數值計算數量,效率更低。**
取出字典中所有的key
Array(namesAndScores.keys)
// ["Craig", "Anna", "Donna", "Brian"]
同理,取出所有的value
Array(namesAndScores.values)
// [8, 2, 6, 2]
修改字典
只有可變字典才能被修改,如果字典是let關鍵字修飾,那就無法被修改
var bobData = ["name": "Bob","profession":"Card Player","country": "USA"]
向字典中新增元素
bobData.updateValue("CA", forKey: "state")
更加簡便的方式
bobData["city"] = "San Francisco"
//["state": "CA", "name": "Bob", "profession": "Card Player", "city": "San Francisco", "country": "USA"]
小測試:
下面的幾個說法哪些是正確的?
let dict4 = ["One": 1, "Two": 2, "Three": 3]
4. dict4[1]
5. dict4["One"]
6. dict4["Zero"] = 0
7. dict4[0] = "Zero"
4字典中沒有1這個key,所以錯誤
5正確,獲取字典中key為"One"的值
6錯誤,字典是let修飾,無法向字典中新增鍵值對
7錯誤,字典中沒有key為0的鍵,且無法向字典中新增鍵值對
更新字典的值
使用updateValue(_:forKey:)方法
bobData.updateValue("Bobby", forKey: "name")// > Bob
直接使用角標
bobData["profession"] = "Mailman"
移除字典中的鍵值對
bobData.removeValue(forKey: "state")
或者用更簡潔的方式,將字典的key賦值為nil,直接將鍵值對從字典中移除
bobData["city"] = nil
** 如果字典中有值是可選類型,使用dictionary[key] = nil方法,同樣會將相對應的鍵值對移除,如果僅僅只是想要將key的值設置為nil,必須使用updateValue方法 **
小測試:
下面的說法哪些是錯誤的?
var dict5 = ["NY": "New York", "CA": "California"]
8. dict5["NY"]
9. dict5["WA"] = "Washington"
10. dict5["CA"] = nil
8正確,獲取鍵為“NY”的值
9正確,新增一個鍵值對
10正確,移除鍵為“CA”的鍵值對
字典的遍歷
使用元組來遍歷字典
for (player, score) in namesAndScores {
print("\(player) - \(score)")}
// > Craig - 8
// > Anna - 2
// > Donna - 6
// > Brian - 2
僅遍歷字典的key
for player in namesAndScores.keys {
print("\(player), ", terminator: "") // no newline
}
print("")
// print one final newline
// > Craig, Anna, Donna, Brian,