原本我以为 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")
*/
其实是我看别人的代码的时候被误导了,所以在此记录一下。规范的命名很重要啊。。。