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"];  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章