247

我在Objective-C中訪問可變字典鍵和值時遇到了一些困難。目標c中的每個循環訪問NSMutable字典

假設我有這樣的:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init]; 

我可以設置鍵和值。現在,我只想訪問每個鍵和值,但我不知道設置的鍵的數量。

在PHP這是很容易的東西如下:

foreach ($xyz as $key => $value) 

怎麼可能在Objective-C?

回答

603
for (NSString* key in xyz) { 
    id value = [xyz objectForKey:key]; 
    // do stuff 
} 

這適用於每一個符合NSFastEnumeration協議(1050 +上和iOS提供)類,雖然NSDictionary是少數藏品,它可以讓你列舉鍵而不是值之一。我建議你閱讀Collections Programming Topic中的fast enumeration

哦,我應該補充說,你應該從不修改集合,而枚舉通過它。

+3

我想知道,不應該是:for(NSString * key in [xyz allKeys])??或者它並不重要。 – 2012-04-02 04:23:24

+5

@ user76859403枚舉字典實際上是枚舉鍵。'for(NSString * key in [xyz allKeys])'概念上是一樣的。 – zneak 2012-04-02 05:09:27

+0

使用[xyz allKeys]如果您需要在枚舉鍵時對詞典進行變異。請參閱下面的答案。 – 2013-06-03 20:05:46

1

您可以使用-[NSDictionary allKeys]訪問所有密鑰並在其中循環。

+2

確實如此,但這確實會創建一個額外的自動釋放數組,這可能非常浪費,特別是對於有很多密鑰的字典。 – 2010-01-27 06:11:17

2

在10.5和iPhone OS中添加了快速枚舉,它顯着更快,不僅僅是語法糖。如果你有目標較舊的運行時(即10.4和向後),你將不得不使用枚舉的老方法:

NSDictionary *myDict = ... some keys and values ... 
NSEnumerator *keyEnum = [myDict keyEnumerator]; 
id key; 

while ((key = [keyEnum nextObject])) 
{ 
    id value = [myDict objectForKey:key]; 
    ... do work with "value" ... 
} 

你不鬆開枚舉對象,你不能復位。如果你想重新開始,你必須從字典中尋求一個新的枚舉器對象。

94

只是爲了不漏掉使用塊枚舉鍵和值

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { 
    NSLog(@"%@ = %@", key, object); 
}]; 

如果你想在行動同時發生的10.6+選項...:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id key, id object, BOOL *stop) { 
    NSLog(@"%@ = %@", key, object); 
}]; 
+2

3種不同的通過字典枚舉的方法。 。 。嘿,這讓我想起了「奇異語言特徵」的答案,其中VB有7種不同類型的循環。 – dreamlax 2010-01-27 05:47:29

+3

那麼...... objectEnumerator在1994年被添加了,在2006年被添加了(...在...),並且在2009年被添加了塊。枚舉的塊形式是自然後果。 – bbum 2010-02-08 04:25:14

+0

這似乎比標準* for ... in *構造更快:http://oneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration – lkraider 2011-07-08 20:40:47

10

如果您需要變異字典,同時列舉:

for (NSString* key in xyz.allKeys) { 
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key]; 
} 
+0

原因是'allKeys'返回密鑰副本。所以變更字典是安全的。 – 2018-03-10 04:05:50

3

枚舉字典的最簡單方法是

for (NSString *key in tDictionary.keyEnumerator) 
{ 
    //do something here; 
} 

其中tDictionary是要遍歷NSDictionaryNSMutableDictionary