遍历NSMutableDictionary


Answers:


211

一个标准的方式看起来像这样

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}

如果只有一种方法可以做到:for (id key, value in myDict)那将是完美的。
路易斯·阿托拉

4
最好通过键(即id key in myDict.allKeys)而不是字典来遍历键。这使您可以更改字典,这可能是您想要的。
marcel salathe 2014年


22

您可以[dict allValues]用来获取NSArray自己的价值观。请注意,它不能保证两次调用之间的顺序。


3
我会在(字典中的id键)上使用它,尤其是在可变字典上,因为如果在枚举时修改字典,后者会引发讨厌的错误。
sigsegv

“它并不能保证” -这是经常需要(大多数语言有一个版本字典,它保证顺序) -它在实践中保持秩序?
亚当

@Adam在MacOS X上,我的顺序非常混乱(不是插入顺序,不是字母顺序,什么也不是),但是两次调用之间是一致的。
jv42

如果映射无关紧要,为什么要使用NSDictionary?
斯蒂芬

2
@stephen通常在某个地方很重要,而在其他地方则不重要。您还将获得在某些情况下可能有用的唯一键约束。
2013年

4
  1. 对于简单循环,快速枚举比基于块的循环快一点
  2. 与快速枚举相比,使用基于块的枚举进行并发或反向枚举要容易得多。使用NSDictionary循环时,可以使用基于块的枚举器一键获得键和值,而使用快速枚举则必须使用键来检索在单独的消息中发送值

快速枚举

for(id key in myDictionary) {
   id value = [myDictionary objectForKey:key];
  // do something with key and obj
}

在块中:

[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

   // do something with key and obj
  }];

3

您不需要将值分配给变量。您可以使用直接访问myDict[key]

    for(id key in myDict) {
        NSLog(@"Key:%@ Value:%@", key, myDict[key]);
    }

2

另一种方法是使用Dicts枚举器。这是来自Apple的一些示例代码:

NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
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.