有没有办法迭代字典?

我知道NSDictionaries是你需要一个key才能获得value 。 但是,我怎样才能遍历NSDictionary所有keysvalues ,以便我知道哪些键和哪些值? 我知道在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

上一篇: Is there a way to iterate over a dictionary?

下一篇: .net standard is cross platform like .net Core?