字典为对象提供了一种确定的键/值对联系的方案。当要将一个对象与一个关键字关联在一起的时候可以用到这种数据结构。其实就像每个人都有自己的名字,人本身就是这里的对象,而名字就是这里的关键字。假设世上没有同名同姓的人,而且每个人有且仅有一个名字,那么任意一个人都可以通过名字找到。
在这里,把这种处理键/值对的数据结构叫做字典,每一个字典都由若干对键/值对组成。与数组一样,字典也有一个子类叫可变字典,顾名思义就是可以增加、减少键/值对的字典。字典的结构如图2-4所示。
1.字典初始化的方法
首先还是来看看如何创建字典。先看两个最常用的初始化方法:
+ (id)dictionaryWithObject:(id)anObject forKey:(id)aKey
+ (id)dictionaryWithObjectsAndKeys:(id)firstObject , ...
第1个方法一般用于单对键/值对字典的初始化;第2个方法一般用于多对键/值对字典的初始化。直接看范例:
NSDictionary * dic1 = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"];
NSDictionary * dic2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"value1", @"key1", @"value2", @"key2", nil];
dic1有一对键/值对,就是@"value"和@"key",dic2有两对键/值对,分别是@"value1"和@"key1"、@"value2"和@"key2"。注意与数组那个方法类似,这里也需要一个"nil "结尾。
?注意:dictionaryWithObjectsAndKeys这个方法很容易出错,主要是没有数清键/值对的个数,经常会漏掉某个或者错写,一定要引起重视,因为如果第一次写不好,后面查起来会很费精力。
2.字典取值的方法
之前提到人好比就是对象,名字好比就是关键字,从一个名字是可以找到一个人的,这个方法就是:
- (id)objectForKey:(id)aKey
看一个简单的例子就能明白这个方法的用法:
NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:
@"value1", @"key1", @"value2", @"key2", nil];
id value = [dic objectForKey:@"key1"];
这里value的值就是@"value1",理解起来应该没有任何障碍吧?
3.可变字典的使用方法
接下来看看可变字典的一些常规使用方法:
- (void)setObject:(id)anObject forKey:(id)aKey
- (void)removeObjectForKey:(id)aKey
细心的读者可能会问:难道就这两个吗?不应该还有个addObject吗?
这里只有这两个:如果一个键/值对存在,setObject这个方法就是修改;如果一个键/值对不存在,这个方法就是增加。下面看个例子:
NSString *[email protected]"lastName";
NSString *[email protected]"firstName";
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Jo", FIRST, @"Smith", LAST, nil];
NSString *[email protected]"middleInitial";
//添加
[dict setObject: @"M" forKey:MIDDLE];
很明显,这里是添加,因为原本并没有@"middleInitial"这个关键字,如果将其改为如下代码:
NSString *[email protected]"lastName";
NSString *[email protected]"firstName";
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAnd-
Keys:
@"Jo", FIRST, @"Smith", LAST, nil];
//修改
[dict setObject: @"M" forKey:LAST];
那么所做的就是修改了,将@"Smith"变成了@"M"。
移除的用法也很简单,举例如下:
NSString *[email protected]"lastName";
NSString *[email protected]"firstName";
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAnd-
Keys:
@"Jo", FIRST,@"Smith", LAST, nil];
//移除后一个键/值对
[dict removeObjectForKey: LAST];
现在 dict里面就只有一个键/值对了。
另外NSMutableDictionary还提供一个整体拼接字典的方法:
- (void)addEntriesFromDictionary:(NSDictionary *)otherDictionary
这个方法在进行多个字典拼接的时候非常有用,举例如下:
//先定义需要使用的KEY
NSString *[email protected]"lastName";
NSString *[email protected]"firstName";
NSString *[email protected]"suffix";
NSString *[email protected]"title";
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Jo", FIRST, @"Smith", LAST, nil];
NSDictionary *newDict=[NSDictionary dictionaryWithObjectsAndKeys:
@"Jones", LAST, @"Hon.", TITLE, @"J.D.", SUFFIX, nil];
//合并两个字典
[dict addEntriesFromDictionary: newDict];
这个方法会改变 dict字典对象的LAST所对应的值,另外再添加@"Hon."和TITLE、@"J.D. "和SUFFIX两个键/值对。