Swift--Dictionary 详解

概述:

Dictionary是一种散列表,可以通过关键值(key)快速地访问其中的元素(value),key必须是符合Hashable协议的类型,而value可以是任何类型。

可以通过字面值创建Dictionary,格式如下,Swift会自动地检测key和value的类型([Int:String])

创建Dictionary

使用 [:] 创建空的Dictionary时,必须声明key和value的类型

创建空的Dictionary


设置和获取Dictionary中的值:

获取Dictionary中的值最常用的方式是把key当作Dictionary的下标来使用

获取Dictionary中的值

通过key获取Dictionary中的值时,返回类型总是Optional,因为并不能确定Dictionary中是否存在与key对应的值。

获取Dictionary的值

还可以通过key的下标形式来更新,修改或者删除key或value

插入新值,修改原有值,删除值


Dictionary的遍历:

通过 for-in 将Dictionary中的每一对键值对(key:value)解析到一个元组中的相应元素,从而实现对Dictionary的无序遍历

遍历Dictionary

在Dictionary中的值发生改变时,Dictionary中键值对的顺序是稳定的(改变key对应的value并不会改变key对应的内存地址),而键值对的顺序在其他方面是不可预测的(遍历时的顺序是不确定)。

如果需要保持键值对之间的顺序性并且不需要Dictionary提供的快速查找特性,请使用 KeyValuePairs 类型

.contains(where:) | .firstIndex(where:) 查找Dictionary中特定的值

查找Dictionary中特定的值

$0 表示散列表中的某一节点,散列表某一节点的属性包括 .key 和 .value

如果使用索引值访问Dictionary,得到的是键值对(索引越界会引发运行错误,所以当索引存在时,返回值类型为非Optional)

通过索引访问散列表

当Dictionary有足够的容量来存储新增加的值时,Dictionary的索引都是有效的,但当Dictionary的大小超过缓存区的大小时,Dictionary的索引可能会在没有任何提示的情况下失效。

上面这段话的意思是,当散列表的容量是有限的时候,散列表存储的记录数达到容量上限时,通过索引并不一定能得到相应的键值对(散列函数发生冲突,此时key对应的不是value,而是存储该value的链表的头指针,此时通过索引不能直接得到value,但是通过key可以得到value)

如果需要规定Dictionary所使用的缓存区的大小,使用 .init(minimumCapacity:) 来分配确定大小的缓存区


Dictionary和NSDictionary之间的桥接:

使用类型转换操作符 as 可完成Dictionary和NSDictionary之间的桥接

为了完成Dictionary到NSDictionary的桥接,要求Dictionary中的key和value都必须是class类型,符合@objc protocol的类型或者可以与Foundation中的类型相桥接的类型(String, Int,Float等)

Dictionary到NSDictionary的桥接的时间复杂度和空间复杂度总是O(1),  但当Dictionary中的key和value不是class类型也不是符合@objc protocol的类型时,Dictionary中的元素到OC中相关类型的桥接总是发生在第一次使用Dictionary中的内容时,时间复杂度为O(n)。

NSDictionary到Dictionary的桥接会调用NSDictionary的copy(with:)方法得到NSDictionary的不可修改的副本(时间复杂度不确定)并进行额外的Swift的统计工作(时间复杂度为O(1)),如果NSDictionary已经是不可修改的,那么copy(with:)方法返回同一个Dictionary(时间复杂度为O(1)),并且与桥接后得到的Dictionary共享同一存储空间,采用copy-on-write的方法对该内存存储进行优化。


参考文献:

苹果官方文档

你可能感兴趣的:(Swift--Dictionary 详解)