有没有办法迭代字典?

我知道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 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]); 

块方法避免运行每个键的查找algorithm:

 [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% ,至less对于上面的简单情况。

这是使用块方法的迭代:

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

自动完成设置非常快,您不必担心写入迭代信封。