swift拾遗(字典)

110 阅读5分钟

字典

字典是一种无序的集合,用于存储同一类型的键和同一类型的值之间的关联关系。每个值都与一个唯一的键相关联,这个键在字典中充当该值的标识符。与数组中的元素不同,字典中的元素没有特定的顺序。当你需要根据标识符查找值时,就可以使用字典,这与在现实世界中使用字典查找特定单词的定义非常相似。

注意

Swift 的 Dictionary 类型与 Foundation 框架中的 NSDictionary 类是桥接的。

有关将 Dictionary 与 Foundation 和 Cocoa 结合使用的更多信息,请参阅“DictionaryNSDictionary 之间的桥接”。

字典类型的简写语法

Swift 字典的完整类型写法是 Dictionary<Key, Value>,其中 Key 是可以用作字典键的值的类型,Value 是字典为这些键所存储的值的类型。

注意

字典的 Key 类型必须遵循 Hashable 协议,就像集合的值类型一样。

你也可以使用简写形式 [Key: Value] 来表示字典的类型。虽然这两种形式在功能上是相同的,但简写形式更受青睐,并且在本指南中提及字典类型时都会使用这种简写形式。

创建空字典

和数组一样,你可以使用初始化语法来创建特定类型的空 Dictionary

image.png 这个示例创建了一个类型为 [Int: String] 的空字典,用于存储整数值的易读名称。该字典的键是 Int 类型,值是 String 类型。

如果上下文已经提供了类型信息,你可以使用空字典字面量来创建一个空字典,空字典字面量写为 [:](方括号内加一个冒号):

image.png

使用字典字面量创建字典

你还可以使用字典字面量来初始化字典,其语法与前面介绍的数组字面量类似。字典字面量是一种将一个或多个键值对写成字典集合的简洁方式。

键值对是键和值的组合。在字典字面量中,每个键值对里的键和值用冒号分隔。这些键值对以列表形式书写,用逗号分隔,并置于一对方括号内:

image.png

airports 字典使用一个包含两个键值对的字典字面量进行初始化。第一对的键是 "YYZ",值是 "Toronto Pearson";第二对的键是 "DUB",值是 "Dublin"

这个字典字面量包含两个 String: String 键值对。这种键值类型与 airports 变量声明的类型相匹配(即一个只包含 String 类型键和 String 类型值的字典),因此可以使用该字典字面量来初始化 airports 字典,并赋予其两个初始条目。

和数组一样,如果你使用一个键和值类型一致的字典字面量来初始化字典,就不必写出字典的类型。airports 的初始化可以采用更简洁的形式来编写:

image.png 由于字典字面量中所有的键彼此类型相同,并且所有的值也彼此类型相同,因此 Swift 可以推断出 [String: String]airports 字典应使用的正确类型。

访问和修改字典

你可以通过字典的方法和属性,或者使用下标语法来访问和修改字典。

和数组一样,你可以通过查看字典的只读 count 属性来了解字典中元素的数量:

image.png

image.png

image.png 你还可以使用下标语法来更改与特定键关联的值:

image.png

除了使用下标语法,你还可以使用字典的 updateValue(_:forKey:) 方法来设置或更新特定键对应的值。和上述使用下标语法的示例一样,updateValue(_:forKey:) 方法在键不存在时会为该键设置一个值,若键已存在则会更新其对应的值。不过,与下标语法不同的是,updateValue(_:forKey:) 方法在更新操作完成后会返回旧值,这让你能够检查是否进行了更新操作。

updateValue(_:forKey:) 方法返回一个字典值类型的可选值。例如,对于一个存储 String 类型值的字典,该方法会返回一个 String? 类型(即“可选 String”)的值。这个可选值在更新前若该键有旧值则包含该旧值,若该键之前不存在对应的值则为 nil

image.png

你还可以使用下标语法从字典中获取特定键对应的值。由于请求的键可能不存在对应的值,所以字典的下标会返回一个字典值类型的可选值。如果字典中包含所请求键对应的值,下标会返回一个包含该键现有值的可选值;否则,下标将返回 nil

image.png

你可以使用下标语法,通过为某个键赋值为 nil 来从字典中移除对应的键值对:

image.png

或者,你也可以使用 removeValue(forKey:) 方法从字典中移除键值对。如果该键值对存在,此方法会将其移除并返回被移除的值;若该键对应的值不存在,则返回 nil

image.png

image.png 有关for - in循环的更多信息,请参阅“for - in循环”。

你还可以通过访问字典的keysvalues属性,获取字典键或值的可迭代集合:

image.png

如果需要在某个接受Array实例的API中使用字典的键或值,可以利用keysvalues属性初始化一个新数组:

image.png

Swift的字典类型没有定义顺序。要按特定顺序遍历字典的键或值,可对其keysvalues属性使用sorted()方法。