Objective-C中字典的使用方法總結


在Objective-C中提供了兩個類來實現字典,即NSDictionaryNSMutableDictionary。其中,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];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM