本节书摘来自华章出版社《编写高质量代码:改善Objective-C程序的61个建议》一 书中的第2章,作者:刘一道,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
建议15:存在公共键时,字典是在对象之间传递信息的绝佳方式
NSDictionary不是仅仅维持对象有序或无序的集合,它根据给定键来存储对象,然后可以用于检索。使用字符串对象作为字典的键,这是最佳的做法,如图2-9所示。
也可以使用其他对象作为键,但要注意,字典使用的每个键都是可以复制的,因此其必须支持NSCopying。如果希望能够使用键–值编码,正如《键–值编码编程指南》中所介绍的,必须使用字符串键的字典对象。
使用字典将对象储存为键–值对,即标识符(键)和对象(值)对。字典是无序集,因为键–值对可采用任何顺序。尽管键几乎可以是任何内容,但通常是描述值的字符串,如 NSFileModificationDate 或 UIApplicationStatusBarFrameUserInfoKey(为字符串常量)。存在公共键时,字典是在对象之间传递各种信息的绝佳方式。
- 创建字典
NSDictionary 类通过初始化程序和类工厂方法,提供了多种创建字典的方法,但只有两个类方法特别常用:dictionaryWithObjects:forKeys: 和 dictionaryWithObjectsAndKeys:(或它们对应的初始化程序)。使用前一种方法时,传入对象数组和键数组;键在位置上与其值匹配。使用第二种方法时,指定第一个对象值及其键,第二个对象值及其键,依此类推;使用 nil 标记此对象序列的结尾。
// First create an array of keys and a complementary array of values
NSArray *keyArray = [NSArray arrayWithObjects:@"IssueDate", @"IssueName",
@"IssueIcon", nil];
NSArray *valueArray = [NSArray arrayWithObjects:[NSDate date], @"Numerology
Today",self.currentIssueIcon, nil];
// Create a dictionary, passing in the key array and value array
NSDictionary *dictionaryOne = [NSDictionary dictionaryWithObjects:valueArray
forKeys:keyArray];
// Create a dictionary by alternating value and key and terminating with nil
NSDictionary *dictionaryTwo = [[NSDictionary alloc]
initWithObjectsAndKeys:[NSDate date],
@"IssueDate", @"Numerology Today", @"IssueName", self.currentIssueIcon,
@"IssueIcon", nil];
如同数组,创建 NSDictionary 对象时,可使用容器字面常量 @{key :value, …},其中“…”表示任意数量的键-值对。例如,以下代码创建含3个键-值对的不可变字典对象:
NSDictionary *myDictionary = @{
@"name" :NSUserName(),
@"date" :[NSDate date],
@"processInfo" :[NSProcessInfo processInfo]
};
- 访问字典中的对象
通过调用 objectForKey: 方法并将键指定为参数,访问字典中的对象值。
NSDate *date = [dictionaryTwo objectForKey:@"IssueDate"];
还可以使用下标访问字典中的对象,键出现在方括号内(方括号紧接在字典变量后面)。
NSString *theName = myDictionary[@"name"];
- 管理可变字典
通过调用 setObject:forKey:和 removeObjectForKey: 方法,在可变字典中插入和删除项目。setObject:forKey: 方法替换给定键的任何现有值。这些方法都很快捷。
还可以使用下标,将键-值对添加到可变字典中。键下标位于赋值左侧,而值位于右侧。
NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
mutableDict[@"name"] = @"John Doe";
要点
(1)字典不仅可以作为无序对象的集合,还可以作为有序对象的集合。
(2)字典可作为有序对象的集合,主要依赖于键值可采用有序。
(3)存在公共键时,字典是在对象之间传递各种信息的绝佳方式。