有没有办法迭代字典?

时间:2009-08-16 14:34:39

标签: ios objective-c foreach iteration nsdictionary

我知道NSDictionaries是您需要key才能获得value的地方。但是,如何迭代keys中的所有valuesNSDictionary,以便了解哪些键,以及有哪些值?我知道在JavaScript中有一个叫做 for-in-loop 的东西。 Objective-C中有类似内容吗?

3 个答案:

答案 0 :(得分:311)

是的,NSDictionary支持快速枚举。使用Objective-C 2.0,您可以这样做:

// To print out all key-value pairs in the NSDictionary myDict
for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

备用方法(如果您的目标是10.5之前的Mac OS X,但仍然可以在10.5和iPhone上使用),则必须使用NSEnumerator

NSEnumerator *enumerator = [myDict keyEnumerator];
id key;
// extra parens to suppress warning about using = instead of ==
while((key = [enumerator nextObject]))
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);

答案 1 :(得分:149)

块方法避免为每个键运行查找算法:

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

即使NSDictionary被实现为hashtable(这意味着查找元素的成本为O(1)),查找仍然会使常量减慢迭代速度因子

我的测量表明,对于数字的d字典......

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (int i = 0; i < 5000000; ++i) {
  NSNumber* value = @(i);
  dict[value.stringValue] = value;
}

...用块方法总结数字......

__block int sum = 0;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* value, BOOL* stop) {
  sum += value.intValue;
}];

...而不是循环方法......

int sum = 0;
for (NSString* key in dict)
  sum += [dict[key] intValue];

... 快了约40%

编辑:新的SDK(6.1+)似乎可以优化循环迭代,因此循环方法现在比块方法快约20%,至少对于上面的简单案例。

答案 2 :(得分:8)

这是使用块方法的迭代:

addFamily()

自动完成设置非常快,您不必担心编写迭代包络。