
4.4 字典类
4.4.1 不可变字典NSDictionary
字典是由键—值(key-value)组成的数据集合,其中值为对象。可以通过键从字典中获取需要的值。字典中的键必须唯一。通常情况下,键为字符串对象,主要用于注明存储对象的说明,但键也可以是其他类型的对象。和键关联的值可以是任何对象类型,但不能是nil。
1.创建不可变字典
在Foundation框架中,提供了NSDictionary类,该类中定义了与字典操作相关的属性以及方法。NSDictionary类是不可变字典,即字典创建完成后,不能再新增/删除键值对。当需要创建一个不可变字典时,通常有以下几种方法。
(1)不可变字典快速创建方法,格式如下:

例如创建一个NSDictionary类的对象,其中存储4个键值对,这4个键值对的key都使用字符串对象,用来说明键值的含义,而value中可以保存各种类型的对象,可以是NSString字符串对象,也可以是NSNumber数字对象。

(2)调用dictionaryWithObjectsAndKeys类方法。使用该方法创建字典时,注意其顺序是:value、key并且要以nil结尾。如下所示创建的字典中,包含了两对键值对,其键key分别为website以及name。

使用键数组和值数组创建字典。把字典中的key以及value,按照对应顺序,分别放在一个数组中,然后调用dictionaryWithObjects: forKeys:方法,创建字典。

注意:key通常为NSString类型,但也可以为其他类型。如下创建的字典中,键为一个NSNumber类的对象,这在语法上是允许的,但实际开发中一般不这样使用。
2.访问字典的键值
字典最常用的操作就是根据键来获取对应的值。通常情况下,有以下两种方式来取值。
- 使用dict[key]的形式。

- 使用objectForKey方法。

运行结果如图4-15所示。

图4-15 运行结果
3.遍历字典中的键值对
在Objective-C中提供了for-in循环,for-in循环除了能够用于遍历数组中的对象之外,也可以用于遍历字典中的键值对。

运行结果如图4-16所示。通过打印的顺序可以验证,在字典中存储的键值对是无序存放的,这个是字典与数组这两个数据存储结构的重要区别。

图4-16 运行结果
4.其他操作
对于字典的操作,除了上面介绍的字典创建以及键值对的取值之外,还有以下几个在NSDictionary类中定义的属性或方法相对常用。
- 获取字典中键值对的数量。

- 获取一个字典中所有的键,返回一个数组。

- 获取一个字典中所有的值,返回一个数组。

4.4.2 可变字典NSMutableDictionary
可变字典类(NSMutableDictionary类)是不可变字典类(NSDictionary类)的子类。NSMutableDictionary类继承了NSDictionary类的属性和方法之外,与不可变字典相比,其存储的键值可以新增、删除以及修改。
1.实例化可变字典对象
在开发中,当需要实例化一个可变字典对象时,可以使用以下一些方法。
- 快速简易方法:使用dictionary方法来初始化一个空的可变字典对象是最简便地得到一个可变字典对象的方法,获得的可变字典对象不指定初始容量。

- dictionaryWithCapacity:方法:使用该方法创建可变字典对象时,需要预先指定可变字典的容量,在初始化时会根据传入的容量参数在内存中预先分配空间。

- initWithContentsOfFile:方法:从指定文件初始化得到一个可变字典对象。

2.增加键值对
与不可变字典相比,通过调用setObject:forKey:方法,可变字典内存储的键值可以增加。

下面所示的代码中,首先创建了一个空的可变字典,然后在该字典中插入了两个键值对,最后打印出可变字典中的键值对。

运行结果如图4-17所示。

图4-17 运行结果
3.修改键值对的值
可变字典除了能够新增键值对之外,还可以对已经存在的键值对的值进行修改。当需要修改键值对时,需要根据键取出字典中的键值对,然后使用赋值运算符更新值。

运行结果如图4-18所示。

图4-18 运行结果
4.移除键值对
当可变字典中的某个/某些键值不再需要时,可以使用NSMutableDictionary中定义的键值移除方法进行删除操作。
- removeObjectForKey:方法,可以移除某个键值对。

- removeObjectsForKeys:方法,可以移除多个键值对,把需要移除的所有键存储在一个数组对象中,作为参数传入。

- 使用removeAllObjects;方法,可以移除可变字典中的所有键值对。
