《编写高质量代码:改善Objective-C程序的61个建议》——建议15:存在公共键时,字典是在对象之间传递信息的绝佳方式

简介:

本节书摘来自华章出版社《编写高质量代码:改善Objective-C程序的61个建议》一 书中的第2章,作者:刘一道,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议15:存在公共键时,字典是在对象之间传递信息的绝佳方式

NSDictionary不是仅仅维持对象有序或无序的集合,它根据给定键来存储对象,然后可以用于检索。使用字符串对象作为字典的键,这是最佳的做法,如图2-9所示。

b97f6ad1cc9737c46d947100da809479aa7dde78

 也可以使用其他对象作为键,但要注意,字典使用的每个键都是可以复制的,因此其必须支持NSCopying。如果希望能够使用键–值编码,正如《键–值编码编程指南》中所介绍的,必须使用字符串键的字典对象。
使用字典将对象储存为键–值对,即标识符(键)和对象(值)对。字典是无序集,因为键–值对可采用任何顺序。尽管键几乎可以是任何内容,但通常是描述值的字符串,如 NSFileModificationDate 或 UIApplicationStatusBarFrameUserInfoKey(为字符串常量)。存在公共键时,字典是在对象之间传递各种信息的绝佳方式。

  1. 创建字典
    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]
};
  1. 访问字典中的对象
    通过调用 objectForKey: 方法并将键指定为参数,访问字典中的对象值。
NSDate *date = [dictionaryTwo objectForKey:@"IssueDate"];

还可以使用下标访问字典中的对象,键出现在方括号内(方括号紧接在字典变量后面)。

NSString *theName = myDictionary[@"name"];
  1. 管理可变字典
    通过调用 setObject:forKey:和 removeObjectForKey: 方法,在可变字典中插入和删除项目。setObject:forKey: 方法替换给定键的任何现有值。这些方法都很快捷。

还可以使用下标,将键-值对添加到可变字典中。键下标位于赋值左侧,而值位于右侧。

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
mutableDict[@"name"] = @"John Doe";

 要点
(1)字典不仅可以作为无序对象的集合,还可以作为有序对象的集合。
(2)字典可作为有序对象的集合,主要依赖于键值可采用有序。
(3)存在公共键时,字典是在对象之间传递各种信息的绝佳方式。

相关文章
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
140 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
218 0
|
存储 供应链 编译器
玩转 Objective-C 的 Mock 对象
测试驱动开发(TDD)中,开发者经常使用模拟对象进行系统设计,模拟对象到底是什么呢?部分模拟对象和全部模拟对象又是什么呢?模拟对象真的让人又爱又恨吗?让我们以Objective-C测试框架OCMock来探个究竟。
179 0
|
C语言 缓存
c语言基础学习12_项目实战:快译通字典
========================================================================================================================================================== 涉及到的知识点有: 项目实战:做一个电子词典,快易通电子词典。
1085 0