Dictionary: Swift中的字典类型
Dictionary
- 字典储存无序的互相关联的同一类型的键和同一类型的值的集合
- 字典类型的全写方式Dictionary<Key, Value>,简写方式[Key: Value], 建议使用简写方式
- 字典的key必须是可哈希的
创建空字典
![](https://img.haomeiwen.com/i1367029/1e9a9edc2585ca70.png)
image-20230225212716312.png
字面量创建字典
- [key 1: value 1, key 2: value 2, key 3: value 3]
![](https://img.haomeiwen.com/i1367029/59d536800e7105d7.png)
image-20230225212910159.png
count和isEmpt
- 可以使用count只读属性来找出Dictionary拥有多少元素
- 使用布尔量isEmpty属性检查字典是否为空
遍历字典
- For-In 循环
- 可以通过访问字典的keys和values属性来取回可遍历的字典的键或值的集合
- Swift的Dictionary类型是无序的。要以特定的顺序遍历字典的键或值,使用键或值的sorted()方法
![](https://img.haomeiwen.com/i1367029/414902dd0aab9664.png)
image-20230225213234467.png
字典的常见操作
添加或更新元素
- 使用下标添加或更新元素
- 使用updateValue(_:forKey:)方法添加或更新元素,返回一个字典值类型的可选项值
移除元素
- 使用下标脚本语法给一个键赋值nil来从字典当中移除一个键值对
- 使用removeValue(forKey:)来从字典里移除键值对。这个方法移除键值对如果他们存在的话,并且返回移除的值,如果值不存在则返回nil
合并两个字典
- merge(_:uniquingKeysWith:)
![](https://img.haomeiwen.com/i1367029/5421c224447aa436.png)
image-20230225215147511.png
//注意merge方法已经被废弃了
var dict = ["a":1,"b":2]
print(dict.merging(["a":2, "c":5], uniquingKeysWith: {(current, _) -> Int in current}))
//merging方法是返回的新的值
//merge会改变原来的值,没有返回值
firstIndex
- 虽然字典是无序的,但是每个kv对在扩容之前的位置是稳定的。如果你需要保持顺序的kv对可以使用KeyValuePairs
![](https://img.haomeiwen.com/i1367029/e8e1ff7d023e52ed.png)
image-20230225215501704.png
底层实现探索
从下标操作谈起
![](https://img.haomeiwen.com/i1367029/190bc18162bd74e9.png)
image-20230225221148792.png
Dictionary._Variant的setValue
![](https://img.haomeiwen.com/i1367029/5470e20f8a9efae3.png)
image-20230225222805657.png
_NativeDictionary的setValue
![](https://img.haomeiwen.com/i1367029/6f208e75881634a7.png)
image-20230225222901907.png
_NativeDictionary的_insert
![](https://img.haomeiwen.com/i1367029/a61e515895d55ab0.png)
image-20230225223011448.png
_NativeDictionary的uncheckedInitialize
![](https://img.haomeiwen.com/i1367029/4937e101f20e2cc1.png)
image-20230225223108655.png
_NativeDictionary的findKey
![](https://img.haomeiwen.com/i1367029/5f088602344acffb.png)
image-20230225223209378.png
网友评论