212

我知道NSDictionaries你需要 akey才能获得value. 但是我怎样才能遍历 allkeysvaluesa NSDictionary,以便我知道有什么键,有什么值呢?我知道有一种叫做for-in-loop in 的东西JavaScript。有没有类似的东西Objective-C

4

3 回答 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 回答