有没有办法遍历字典?


200

我知道NSDictionaries您需要一个key才能得到一个东西value。但是,如何遍历keysvalues在中进行遍历NSDictionary,以使我知道其中有哪些键,以及有哪些值?我知道在中有一个叫做for-in-loop的东西JavaScript。有类似的东西Objective-C吗?


感谢这篇文章。如果在Swift语法上进行迭代,请参阅以下文章:stackoverflow.com/a/24111700/419348
AechoLiu

Answers:


323

是的,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]);

2
ObjC现代语法:NSLog(@“ key =%@ value =%@”,key,myDict [key]);
geowar

@Darthenius由于最近的优化,至少在某些情况下,快速枚举再次比基于块的更快。但是,如果要解决的问题允许您使用并发选项,则基于块的方法可能会更快。
Zev Eisenberg 2014年

@ZevEisenberg看到我的帖子的结尾。
RokStrniša2014年

糟糕,我点击了上面的链接,以在新标签页中打开,甚至没有注意到是谁编写的,或者根本不在同一页上。如果您仍然可以编辑上面的评论,则可能需要这样做,以便懒惰的读者不会误解。
泽夫·艾森伯格2014年

153

块方法避免为每个键运行查找算法:

[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%


在iOS 10/11中,哪个更快?
Supertecnoboff

优雅,喜欢它!
YvesLeBorg

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.
    }];

使用自动补全设置非常快,您不必担心编写迭代包络。


谢谢..如果您需要NSMutableDictionary在过程中进行突变的话,很好的解决方案
jose920405,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.