用于Objective-C中用于访问NSMutable字典的每个循环


268

我在访问Objective-C中的可变字典键和值时遇到了一些困难。

假设我有这个:

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

我可以设置键和值。现在,我只想访问每个键和值,但是我不知道设置的键数。

在PHP中非常简单,如下所示:

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

在Objective-C中怎么可能?

Answers:


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

尽管它NSDictionary是少数几个可以枚举键而不是值的集合之一,但是它适用于每个符合NSFastEnumeration协议(在10.5+和iOS上可用)的类。我建议您在“ 集合编程主题”中阅读有关快速枚举的信息。

哦,我要补充一点,但是您在枚举集合时绝对不要修改集合。


4
我想知道,是否应该这样:for([xyz allKeys]中的NSString *键)?还是不是很重要。
FlowUI。SimpleUITesting.com 2012年

6
@ user76859403实际上,枚举字典是枚举键。for (NSString* key in [xyz allKeys])在概念上是同一件事。
zneak

如果需要在枚举键时使字典发生变异,请使用[xyz allKeys]。请参阅下面的答案。
Brody Robertson

这个循环一直都返回相同的顺序吗?还是我们需要另一种方法将其用于TableView部分?
ymutlu

1
@ymutlu,可可字典是无序的。这意味着,每当您修改它们时,它们的迭代顺序可能会更改。
zneak 2014年

98

只是为了不遗漏使用块枚举键和值的10.6+选项...

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

如果您希望这些动作同时发生:

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

2
通过字典枚举的3种不同方法。。。嘿,这让我想起了“最奇怪的语言功能”的答案,其中VB有7种不同的循环。
dreamlax 2010年

3
嗯... objectEnumerator在1994年添加,for(... in ...)在2006年添加,而Blocks在2009年添加。枚举的块形式是自然的产物。
bbum 2010年


1
@lkraider,我评论了该文章,该文章实际上将基于块的枚举与旧的for循环(而不是for ... in构造)进行了比较。
奎因·泰勒

有什么*stop用 您如何利用它?有参考吗?
borisdiakur 2012年

13

如果您需要在枚举时对字典进行变异

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

原因是allKeys返回键的副本。因此,对字典进行变异是安全的。
Honghao张

5

枚举字典的最简单方法是

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

这里tDictionaryNSDictionary还是NSMutableDictionary要迭代。



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" ...
}

您不会释放枚举器对象,也无法重置它。如果要重新开始,则必须从字典中请求一个新的枚举器对象。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.