原本我以爲 Swift 中的字典和其它語言中的字典應該差不多,所以不打算單獨寫一篇關於字典的博客。可學習了之後我才發現 Swift 中的字典竟然有很多與衆不同的地方。嚇得我趕緊記錄一下。。。
和其它語言中一樣的地方就沒啥好說的了,我們直接來說它與衆不同的地方。
我們先拿數組來做比較。首先,在數組中肯定不能訪問不存在的下標,否則會出現越界的錯誤,這點大家都知道。
但是,字典卻可以!
var dict = ["key1":"value1" , "key2":"value2"]
dict["key3"] = "value3"
print(dict) // 輸出結果爲 ["key1": "value1", "key3": "value3", "key2": "value2"] (別忘了字典是無序的)
我們訪問了一個不存在的 key3,最終結果是創建了新的一項。
然後來說 nil,還記得上篇文章我們怎麼講 nil 的嗎?
只有最下面這種寫法纔是正確的。但是字典又可以!
var dict = ["key1":"value1", "key2":"value2", "key3":"value3"]
dict["key2"] = nil
print(dict) // 輸出結果爲 ["key1": "value1", "key3": "value3"]
我們直接把鍵爲 key2 的值賦成 nil,最終結果是從字典中移除了這一項。增加新項還有其它方式,比如:
dict.updateValue("123", forKey: "key4")
如果有 key4 這一項,會更新該項。如果沒有這項的話就會新增這一項。
刪除項也有其它方式,比如:
dict.removeValueForKey("key1") // 這裏即使寫不存在的也不會出錯,比如"key8"、"key9"
遍歷所有的鍵:
for keys in dict.keys {
print(keys)
}
/*
key1
key3
key2
*/
這種比較好理解。還可以直接利用 keys 構造一個新數組:
let keysArray = Array(dict.keys)
print(keysArray)
/*
["key1", "key3", "key2"]
*/
上面這些都比較好理解,但還有其它方式:
for (key, _) in dict {
print(key)
}
/*
key1
key3
key2
*/
注意 '_' 的用法,此處代表我們只關心 key,不關心 value。
類似的,獲取 value 也有這些方法:
for values in dict.values {
print(values)
}
/*
value1
value3
value2
*/
let valuesArray = Array(dict.values)
print(valuesArray)
/*
["value1", "value3", "value2"]
*/
for (_, value) in dict {
print(value)
}
/*
value1
value3
value2
*/
那如果想同時獲取 key 和 value 呢?
for (key, value) in dict {
print(key, value)
}
/*
key1 value1
key3 value3
key2 value2
*/
嗯,這個也比較好理解,那你猜猜下面的代碼輸出是什麼?
for key in dict {
print(key)
}
估計會有很多人和我一樣,認爲是輸出三個 key 吧?
然而,事實卻是:
/*
("key1", "value1")
("key3", "value3")
("key2", "value2")
*/
for aDictionary in dict {
print(aDictionary)
}
/*
("key1", "value1")
("key3", "value3")
("key2", "value2")
*/
其實是我看別人的代碼的時候被誤導了,所以在此記錄一下。規範的命名很重要啊。。。