在Objective-C中提供了兩個類來實現字典,即NSDictionary和NSMutableDictionary。其中,NSMutableDictionary是NSDictionary的子類,它繼承父類方法的同時又支持對數據進行插入和刪除操作,它們共同實現了以“鍵值對”的方式存儲數據。
// Objective-C中實現的字典相比於其他語言而言,還有一個最大的不同:即同一個字典中可以保存不同類型的對象。
字典類的存在就是為了解決大量數據中的查找問題,因為它是通過key直接找到value的,所以速度極快,避免了遍歷所造成的效率低下問題。
1 NSDictionary
1.1 創建不可變字典
可以使用類方法dictionaryWithObjectsAndKeys:創建並初始化字典,示例如下:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"val1", @"key1", @"val2", @"key2", nil];
注意:在使用鍵值對初始化字典時,“值”在前,“鍵”在后,成對出現,各個參數之間使用逗號分隔,並且最后使用nil結束。使用以上方法創建的字典內存分布如下圖所示:

1.2 獲取字典大小
在執行字典操作之前,常常需要獲取字典大小,也就是確定字典中“鍵值對”的數量,我們可以使用count消息,使用方法如下:
int cnt = [dict count];
該方法會返回一個NSInteger類型的變量,我們也可以直接使用int類型的變量接收。
1.3 得到字典中所有的KEY
對字典發送keyEnumerator消息可以返回一個枚舉對象,其中存儲了字典中所有的鍵:
NSEnumerator *enumKeys = [dict keyEnumerator]; for (NSObject *obj in enumKeys){ NSLog(@"enumKey: %@", obj); }
使用“for-in”語法可以實現可枚舉對象的遍歷,以上代碼中的循環可以遍歷所有鍵,並且輸出:
2016-07-24 10:03:11.873 OCTest[2547:94272] enumKey: key1 2016-07-24 10:03:13.753 OCTest[2547:94272] enumKey: key2
注意:如果我們直接使用"for-in"語法遍歷字典對象,實際上也相當於對“鍵”的遍歷。
for (NSObject *obj in dict){ NSLog(@"key in dict: %@", obj); }
執行以上代碼的輸出為:
2016-07-24 10:10:17.590 OCTest[2667:97958] key in dict: key1 2016-07-24 10:10:17.590 OCTest[2667:97958] key in dict: key2
1.4 遍歷字典中的所有VALUE
可以使用獲取“鍵”類似的方法獲取字典中的“值”,只需要對字典發送objectEnumerator消息即可:
NSEnumerator *enumValues = [dict objectEnumerator]; for (NSObject *obj in enumValues){ NSLog(@"value in dict: %@", obj); }
運行結果如下:
2016-07-24 10:14:41.984 OCTest[2702:100424] value in dict: val1 2016-07-24 10:14:41.984 OCTest[2702:100424] value in dict: val2
1.5 根據KEY檢索VALUE
對於字典而言,最常見的操作就是查找了,也就是根據給定的KEY,檢索對應的VALUE,方法如下:
NSObject *value = [dict objectForKey:@"key1"]; if (value != nil){ NSLog(@"value in dict: %@", value); }
運行結果如下:
2016-07-24 10:20:09.012 OCTest[2736:103393] value in dict: val1
2 NSMutableDictionary
2.1 創建可變字典
可變字典,就意味着我們可以在后續操作過程中向字典中添加或者刪除“鍵值對”,因此,最開始的時候我們可以創建一個空字典,常用的方法有:
NSMutableDictionary *mdict = [@{} mutableCopy];
NSMutableDictionary *mdict = [NSMutableDictionary dictionary];
以上兩種方法都可以創建一個空的可修改字典。但是,后續再向其中追加數據時,需要不斷的分配內存(懶漢模式)。當然,如果我們能夠預知字典的規模,那么可以在創建它的時候就初始化它的大小(餓漢模式):
NSMutableDictionary *mdict = [NSMutableDictionary dictionaryWithCapacity:10];
以上方法也會創建一個空字典,但是不同之處在於它已經提前分配了足以容納10個鍵值對內容的內存。
注:因為NSMutableDictionary是NSDictionary的子類,當然也可以用它父類的dictionaryWithObjectsAndKeys:方法來創建可變字典。
2.2 向字典中添加數據
[mdict setObject:@"mval01" forKey:@"mkey01"]; [mdict setObject:@"mval02" forKey:@"mkey02"];
因為字典是無序的,因此不用指定插入的位置。如果字典中已經存在對應的KEY值,那么就直接替換掉該KEY對應的值,也就是相當於修改操作;如果不存在,則將該“鍵值對”添加到字典當中。
2.3 刪除字典中的數據
[mdict removeObjectForKey:@"mkey01"];
可以指定“鍵”的方式刪除字典中對應的“鍵值對”,如果該Key不存在,則不做任何操作。你也可以使用下面的方法清空整個字典的數據:
[mdict removeAllObjects];
