我知道NSDictionaries
是您需要key
才能获得value
的地方。但是,如何迭代keys
中的所有values
和NSDictionary
,以便了解哪些键,以及有哪些值?我知道在JavaScript
中有一个叫做 for-in-loop 的东西。 Objective-C
中有类似内容吗?
答案 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()
自动完成设置非常快,您不必担心编写迭代包络。