有没有办法迭代字典?
我知道NSDictionaries
是你需要一个key
才能获得value
。 但是我怎样才能迭代NSDictionary
所有keys
和values
,以便我知道哪些键,哪些值? 我知道在JavaScript
有一种叫做for-in-loop的东西。 Objective-C
有类似的东西吗?
是的, 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
:
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]);
块方法避免运行每个键的查找algorithm:
[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% ,至less对于上面的简单情况。
这是使用块方法的迭代:
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. }];
自动完成设置非常快,您不必担心写入迭代信封。