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