字典
字典是一种无序的集合,用于存储同一类型的键和同一类型的值之间的关联关系。每个值都与一个唯一的键相关联,这个键在字典中充当该值的标识符。与数组中的元素不同,字典中的元素没有特定的顺序。当你需要根据标识符查找值时,就可以使用字典,这与在现实世界中使用字典查找特定单词的定义非常相似。
注意
Swift 的 Dictionary
类型与 Foundation 框架中的 NSDictionary
类是桥接的。
有关将 Dictionary
与 Foundation 和 Cocoa 结合使用的更多信息,请参阅“Dictionary
与 NSDictionary
之间的桥接”。
字典类型的简写语法
Swift 字典的完整类型写法是 Dictionary<Key, Value>
,其中 Key
是可以用作字典键的值的类型,Value
是字典为这些键所存储的值的类型。
注意
字典的 Key
类型必须遵循 Hashable
协议,就像集合的值类型一样。
你也可以使用简写形式 [Key: Value]
来表示字典的类型。虽然这两种形式在功能上是相同的,但简写形式更受青睐,并且在本指南中提及字典类型时都会使用这种简写形式。
创建空字典
和数组一样,你可以使用初始化语法来创建特定类型的空 Dictionary
:
这个示例创建了一个类型为
[Int: String]
的空字典,用于存储整数值的易读名称。该字典的键是 Int
类型,值是 String
类型。
如果上下文已经提供了类型信息,你可以使用空字典字面量来创建一个空字典,空字典字面量写为 [:]
(方括号内加一个冒号):
使用字典字面量创建字典
你还可以使用字典字面量来初始化字典,其语法与前面介绍的数组字面量类似。字典字面量是一种将一个或多个键值对写成字典集合的简洁方式。
键值对是键和值的组合。在字典字面量中,每个键值对里的键和值用冒号分隔。这些键值对以列表形式书写,用逗号分隔,并置于一对方括号内:
airports
字典使用一个包含两个键值对的字典字面量进行初始化。第一对的键是 "YYZ"
,值是 "Toronto Pearson"
;第二对的键是 "DUB"
,值是 "Dublin"
。
这个字典字面量包含两个 String: String
键值对。这种键值类型与 airports
变量声明的类型相匹配(即一个只包含 String
类型键和 String
类型值的字典),因此可以使用该字典字面量来初始化 airports
字典,并赋予其两个初始条目。
和数组一样,如果你使用一个键和值类型一致的字典字面量来初始化字典,就不必写出字典的类型。airports
的初始化可以采用更简洁的形式来编写:
由于字典字面量中所有的键彼此类型相同,并且所有的值也彼此类型相同,因此 Swift 可以推断出
[String: String]
是 airports
字典应使用的正确类型。
访问和修改字典
你可以通过字典的方法和属性,或者使用下标语法来访问和修改字典。
和数组一样,你可以通过查看字典的只读 count
属性来了解字典中元素的数量:
你还可以使用下标语法来更改与特定键关联的值:
除了使用下标语法,你还可以使用字典的 updateValue(_:forKey:)
方法来设置或更新特定键对应的值。和上述使用下标语法的示例一样,updateValue(_:forKey:)
方法在键不存在时会为该键设置一个值,若键已存在则会更新其对应的值。不过,与下标语法不同的是,updateValue(_:forKey:)
方法在更新操作完成后会返回旧值,这让你能够检查是否进行了更新操作。
updateValue(_:forKey:)
方法返回一个字典值类型的可选值。例如,对于一个存储 String
类型值的字典,该方法会返回一个 String?
类型(即“可选 String
”)的值。这个可选值在更新前若该键有旧值则包含该旧值,若该键之前不存在对应的值则为 nil
:
你还可以使用下标语法从字典中获取特定键对应的值。由于请求的键可能不存在对应的值,所以字典的下标会返回一个字典值类型的可选值。如果字典中包含所请求键对应的值,下标会返回一个包含该键现有值的可选值;否则,下标将返回 nil
:
你可以使用下标语法,通过为某个键赋值为 nil
来从字典中移除对应的键值对:
或者,你也可以使用 removeValue(forKey:)
方法从字典中移除键值对。如果该键值对存在,此方法会将其移除并返回被移除的值;若该键对应的值不存在,则返回 nil
:
有关
for - in
循环的更多信息,请参阅“for - in
循环”。
你还可以通过访问字典的keys
和values
属性,获取字典键或值的可迭代集合:
如果需要在某个接受Array
实例的API中使用字典的键或值,可以利用keys
或values
属性初始化一个新数组:
Swift的字典类型没有定义顺序。要按特定顺序遍历字典的键或值,可对其keys
或values
属性使用sorted()
方法。