NSArray和NSMutableArray存儲數據是將每一個元素挨個存儲到數組中,但是NSMutableArray如果刪除。新增元素後,這個元素後面的元素對應的下標就會發生變化,所以NSMutableArray的缺點時下標不可靠。爲此Apple提供了一個新的類NSDictionary來解決這個問題,在存儲數據到數組時,爲存儲到數組中每個元素取一個固定的別名(key)。NSDictionary(不可變字典集合)一旦創建完畢,其鍵值對的個數就固定了,並且無法刪除,新增鍵值對。特別要注意的是鍵值對中的值只能是oc對象,鍵必須要是實現了NSCopying協議的oc對象。
-
#import <Foundation/Foundation.h>
-
-
int main()
-
{
-
@autoreleasepool {
-
-
NSDictionary* dict1 = [NSDictionary dictionary];
-
NSLog(@"%@", dict1);
-
-
-
NSDictionary* dict2 = [NSDictionary dictionaryWithObjectsAndKeys: @"jack", @"name", @"18", @"age", nil nil];
-
NSLog(@"%@", dict2);
-
-
-
NSDictionary* dict3 = @{@"name" : @"bowsloan", @"age" : @"23", };
-
NSLog(@"%@", dict3);
-
}
-
return 0;
-
}
存儲原理:字典中的鍵值對仍然是以數組形式存儲的,但並不是挨個存儲。在往字典集合中存儲數據的時候,會將key和數組長度根據哈希表算法計算出一個下標。取值的時候,也是將key和數組長度根據哈希算法計算出一個下標,然後根據下標取值。存的效率:NSArray效率更高。取的效率:如果把所有的數據一次性取出使用NSArray,如果只取出特定的元素使用NSDictionary
-
#import <Foundation/Foundation.h>
-
-
int main()
-
{
-
@autoreleasepool {
-
-
NSDictionary* dict1 = @{@"name" : @"bowsloan", @"age" : @"23", @"name" : @"baoshilong"};
-
NSLog(@"%@", dict1);
-
-
-
NSUInteger count = dict1.count;
-
NSLog(@"%lu", count);
-
-
-
NSString* name = [dict1 objectForKey: @"name"];
-
NSLog(@"%@", name);
-
-
-
NSString* age = dict1[@"age"];
-
NSLog(@"%@", age);
-
NSString* character = dict1[@"character"];
-
NSLog(@"%@", character);
-
-
-
for (id key in dict1) {
-
NSLog(@"%@ = %@", key, dict1[key]);
-
}
-
-
}
-
return 0;
-
}
建議:
“字典”(dictionary)是一種映射型數據結構,可向其中添加鍵值對。與數組一樣,objective-c代碼也經常用到字典。
一般我們創建一個字典數組採用的是如下這種方式:
-
<strong style="font-size:18px;"> </strong><span style="font-size:14px;">NSDictionary* personData = [NSDictionary dictionaryWithObjectsAndKeys: @"bowsloan", @"name", [NSNumber numberWithInt: 28], @"age", nil nil];</span>
這樣的寫法會很令人困惑,因爲其順序是<對象>,<鍵>,<對象>,<鍵>。這與通常理解的順序相反。因此,這種寫法不容易懂。所以,建議用字面量語法。如下:
-
<span style="font-size:14px;">NSDictionary* personData = @{@"name" : @"bowsloan", @"age" : @"23"};</span>
上面這種寫法簡明,而且鍵出現在對象之前,比較容易理解。此範例代碼還說明了使用字面量數值的好處。字典中的對象和鍵都必須是objective-c對象,所以不能直接把整數23放進去,而要將其封裝在NSNumber示例中才行。使用字面量語法很容易就能做到這一點,只需要給數字前面加一個@字符即可。
還有個好處就是字典數組與一般數組一樣,用字面量語法創建字典時,一旦有值爲nil,便會拋出異常。
字典也可以像數組那樣用字面量語法訪問,按照特定鍵訪問其值的傳統做法是:
-
<span style="font-size:14px;"> NSString* name = [personData objectForKey: @"name"];</span>
與之等效的字面量語法則是:
-
NSString* name = personData[@"name"];