005-NSDictionary

NSArray和NSMutableArray存储数据是将每一个元素挨个存储到数组中,但是NSMutableArray如果删除。新增元素后,这个元素后面的元素对应的下标就会发生变化,所以NSMutableArray的缺点时下标不可靠。为此Apple提供了一个新的类NSDictionary来解决这个问题,在存储数据到数组时,为存储到数组中每个元素取一个固定的别名(key)。NSDictionary(不可变字典集合)一旦创建完毕,其键值对的个数就固定了,并且无法删除,新增键值对。特别要注意的是键值对中的值只能是oc对象,键必须要是实现了NSCopying协议的oc对象。

[objc] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. int main()  
  4. {  
  5.     @autoreleasepool {  
  6.         //创建一个空的字典集合,没有意义,因为无法为这个字典数组新增元素  
  7.         NSDictionary* dict1 = [NSDictionary dictionary];  
  8.         NSLog(@"%@", dict1);  //输出{ }  
  9.           
  10.         //创建字典集合,并指定键值对,注意: 值在前,键在后,结尾有nil  
  11.         NSDictionary* dict2 = [NSDictionary dictionaryWithObjectsAndKeys@"jack"@"name"@"18"@"age", nil nil];  
  12.         NSLog(@"%@", dict2); //输出{ age = 18, name = jack }  
  13.           
  14.         //快速创建字典的方法,以 键值对 形式创建  
  15.         NSDictionary* dict3 = @{@"name" : @"bowsloan"@"age" : @"23", };  
  16.         NSLog(@"%@", dict3); //输出{ age = 23, name = bowsloan }  
  17.     }  
  18.     return 0;  
  19. }  

存储原理:字典中的键值对仍然是以数组形式存储的,但并不是挨个存储。在往字典集合中存储数据的时候,会将key和数组长度根据哈希表算法计算出一个下标。取值的时候,也是将key和数组长度根据哈希算法计算出一个下标,然后根据下标取值。
存的效率:NSArray效率更高。
取的效率:如果把所有的数据一次性取出使用NSArray,如果只取出特定的元素使用NSDictionary

[objc] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. int main()  
  4. {  
  5.     @autoreleasepool {  
  6.         //如果存在相同的键,后面的将不会存进去  
  7.         NSDictionary* dict1 = @{@"name" : @"bowsloan"@"age" : @"23"@"name" : @"baoshilong"};  
  8.         NSLog(@"%@", dict1); //结果将只会输出{ age = 23;, name = bowsloan;}  
  9.           
  10.         //得到字典数组中键值对的个数  
  11.         NSUInteger count = dict1.count;//等价于 NSUInteger count = [dict1 count];  
  12.         NSLog(@"%lu", count);  
  13.           
  14.         //利用对象方法取值,如果键不存在取出的值就是null  
  15.         NSString* name = [dict1 objectForKey@"name"];  
  16.         NSLog(@"%@", name);  
  17.           
  18.         //简洁取值,如果键不存在取出的值就是null  
  19.         NSString* age = dict1[@"age"];  
  20.         NSLog(@"%@", age);  
  21.         NSString* character = dict1[@"character"];  
  22.         NSLog(@"%@", character); //输出结果为(null)  
  23.           
  24.         //使用增强for循环遍历字典数组  
  25.         for (id key in dict1) {  
  26.             NSLog(@"%@ = %@", key, dict1[key]);  
  27.         }  
  28.           
  29.     }  
  30.     return 0;  
  31. }  

建议:

“字典”(dictionary)是一种映射型数据结构,可向其中添加键值对。与数组一样,objective-c代码也经常用到字典。

一般我们创建一个字典数组采用的是如下这种方式:

[objc] view plaincopy
  1. <strong style="font-size:18px;"> </strong><span style="font-size:14px;">NSDictionary* personData = [NSDictionary dictionaryWithObjectsAndKeys@"bowsloan"@"name", [NSNumber numberWithInt: 28], @"age", nil nil];</span>  
 这样的写法会很令人困惑,因为其顺序是<对象>,<键>,<对象>,<键>。这与通常理解的顺序相反。因此,这种写法不容易懂。所以,建议用字面量语法。如下:

[objc] view plaincopy
  1. <span style="font-size:14px;">NSDictionary* personData = @{@"name" : @"bowsloan"@"age" : @"23"};</span>  
 上面这种写法简明,而且键出现在对象之前,比较容易理解。此范例代码还说明了使用字面量数值的好处。字典中的对象和键都必须是objective-c对象,所以不能直接把整数23放进去,而要将其封装在NSNumber示例中才行。使用字面量语法很容易就能做到这一点,只需要给数字前面加一个@字符即可。

还有个好处就是字典数组与一般数组一样,用字面量语法创建字典时,一旦有值为nil,便会抛出异常。

字典也可以像数组那样用字面量语法访问,按照特定键访问其值的传统做法是:

[objc] view plaincopy
  1. <span style="font-size:14px;"> NSString* name = [personData objectForKey@"name"];</span>  

与之等效的字面量语法则是:

[objc] view plaincopy
  1. NSString* name = personData[@"name"];  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章