有没有办法迭代字典?
我知道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 pre-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]);
块方法避免了为每个键运行查找算法:
[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.
}];
自动完成设置非常快,您不必担心写入迭代信封。
链接地址: http://www.djcxy.com/p/81895.html