第二节 字典

本文来自于疯子们的开源图书


字典是存储多个相同类型值的容器。每个值用一个唯一的键进行标识,这个键就是字典中的标示符。与数组中的元素不同,字典中的元素没有固定的顺序。当你想在字典中查询某个值的时候,可以根据他们的键来进行查询,这点跟现实中在字典上查询某个单词很类似的。

Swift中字典所能存储的键值都是非常明确的。与Objective-C中的NSDictionaryNSMutableDictionary不同,他们可以使用任何类型的对象作为键和值,而且没有提供关于这些对象类型的信息。在Swift中,某个字典类型所能存储的键和值的类型是非常明确的,要么通过类型注解,要么就是通过类型推断来明确的声明一下。

Swift的字典类型可以写作Dictionary<KeyType,ValueType>,其中KeyType是键的类型,ValueType是值的类型。

KeyType的唯一限制就是必须可以作为哈希值的,也就是说,它的值必须的是唯一的。所有Swift的基本类型(String,Int,Double,Bool)默认都是可以作为哈希值的,因此都可以作为字典的键。枚举类型的成员也是默认可以作为哈希值的。

字典

你可以使用一个字典值来初始化一个字典,语法跟之前的初始化数组是类似的。字典值是创建具有一个或者多个键值对的字典的快捷方式。

一个键值对是一个键和值的组合。在字典值当中,每个键值对都是使用分号来分隔键和值的。这些键值对可以写作一个列表,使用方括号包裹起来,用逗号分隔开来。

下面的例子创建了一个字典来存储国际机场的名字。这个字典中,键是三个字母的国际航空运输协会编码,值是 机场的名字:

上面的airports字典声明的类型为:Dictionary<String ,String>,表示一个键是String类型,值为StringDictionary类型。

注意:

airports声明的时候,使用的是var(变量),而不是let(常量),因为之后更多的机场会加到这个字典中的。

airports使用了两个键值对来进行初始化的。第一个键值对的键为TYO,值为Tokyo.第二个键值对的键为DUB,值为Dublin.

这个字典值包含两个String:String对。符合airports变量声明(键为String ,值为String)的类型,所以上面给airports字典初始化的语句是合法的。

就像数组一样,如果使用键和值类型一致的字典值来初始化字典的话,就没有必要指明字典的类型了。airports的初始化过程可以简写为:

由于字典值中的的键都是同样类型的,值也是同样类型的,因此Swift可以推断出airport的类型为Dictionary<String,String>.

字典的访问与修改

可以通过字典的方法,属性,或者使用下标来访问和修改一个字典。像数组一样,可以通过只读属性count来查看Dictionary中的元素个数.

可以使用下标来给字典添加一个新元素。使用一个适当类型的键值作为小标,并赋予一个适当类型的新值。

也可以通过下标来改变某个键对应的值。

除了下标之外,也可以使用updateValue(forKey:)来设置或者更新某个键的值。就像上面的使用下标的例子,如果某个键的值不存在,updateValue(forKey:)会设置值,否则的话,更新该值。与下标不同,updateValue(forKey:)在更新完成之后,会返回更新之前的值。这可以使你能够判断是否真的更新了。

updateValue(forKey:)方法返回的是一个可选类型。例如,一个值为String的字典,该方法返回的就是String?.如果有值的话,就是键对应的值。否则的话,返回的时nil.

也可以通过下标从字典中获取某个键对应的值。同上面的一样,返回的也是一个可选类型

可以使用下标从字典中移除某个键值对,只需要将那个键对应的值置为nil即可:

此外,可以使用removeValueForKey移除一个键值对。如果键值对存在的话,移除之后返回被移除的值,否则返回nil.

字典的遍历

可以使用for-in循环来遍历字典的键值对。字典中的元素作为(key,value)来返回。在循环当中,可以将键值对分解成两个临时的变量或者常量。

关于for-in 循环,可以参考For循环

也可以通过字典的keysvalues属性单独遍历它的键或者值。

可以使用Array()方法,将字典的keys或者values初始化为一个数组:

注意:

Swift的Dictionary类型是一个无序集合,在遍历一个字典的时候,取出的键,值,键值对的书序是随机的。

创建一个空字典

就像数组一样,可以使用构造器来创建一个具有某种类型的空Dictionary

这个例子创建了一个空的字典,类型为(Int,String),来存储整数及其易于阅读的名字。键是Int类型的,值是String类型的。

如果上下文已经提供了类型信息的话,就可以用空字典值来创建一个空字典,写作[:]

注意:

底层,Swift的数组和字典类型都是作为泛型来实现。更多关于泛型,参见泛型

集合的可变性

数组和集合都可以在单一集合中存储多个值。如果你创建一个数组或者集合,并把它赋给一个变量,那么这个集合就是可变的,意味值你可以添加更多的元素来改变集合的大小,移除已经存在的集合。相反,如果将集合赋给一个常量,那么集合就是不可变的,大小也不能改变。

对于字典来说,不可变指的是你不能修改某个键的值。不可变字典的值一旦设置,就不能再改变了。

对于数组来说,不可变的含义稍微有点差别。你仍然不能执行任何有可能改变数组大小的操作。但是你可以改变数组中某个位置的值。在数组大小固定的情况下,可以使得Array类型的操作获得最优秀的性能。

Array类型的可变性也影响到了数组实例的赋值和修改。更多信息,可以参考集合类型的赋值和拷贝

注意:

在集合大小不需要改变的情况时,最好创建不可变的集合。这有助于编译器优化你创建集合的性能。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值