我知道NSDictionaries
你需要 akey
才能获得value
. 但是我怎样才能遍历 allkeys
和values
a NSDictionary
,以便我知道有什么键,有什么值呢?我知道有一种叫做for-in-loop in 的东西JavaScript
。有没有类似的东西Objective-C
?
HelloMoon
问问题
128094 次
3 回答
344
是的,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 *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]);
于 2009-08-16T14:40:16.627 回答
159
块方法避免为每个键运行查找算法:
[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%,至少对于上面的简单情况。
于 2012-09-17T07:24:45.430 回答
10
这是使用块方法的迭代:
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.
}];
使用自动补全设置非常快,而且您不必担心编写迭代信封。
于 2015-08-31T07:16:27.150 回答