Answers:
是的,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]);
备用方法(如果要以Mac OS X 10.5之前的版本为目标,则必须使用该方法,但仍可以在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]);
块方法避免为每个键运行查找算法:
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop) {
NSLog(@"%@ => %@", key, value);
}];
即使NSDictionary
将其实现为哈希表(这意味着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%。
这是使用块方法的迭代:
NSDictionary *dict = @{@"key1":@1, @"key2":@2, @"key3":@3};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@->%@",key,obj);
// Set stop to YES when you wanted to break the iteration.
}];
使用自动补全设置非常快,您不必担心编写迭代包络。
NSMutableDictionary
在过程中进行突变的话,很好的解决方案
Swift
语法上进行迭代,请参阅以下文章:stackoverflow.com/a/24111700/419348