我知道 NSDictionaries
是需要一个 key
才能获取对应的 value
的。但是,我该如何遍历所有 keys
和 values
并了解有哪些键和值? 我知道在 JavaScript
中有一种叫做 for-in-loop 的东西。 在 Objective-C
中有类似的东西吗?
我知道 NSDictionaries
是需要一个 key
才能获取对应的 value
的。但是,我该如何遍历所有 keys
和 values
并了解有哪些键和值? 我知道在 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 *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.
}];
使用自动完成非常快速方便,而且您不必担心编写循环包装。
使用自动完成非常快速方便,而且您不必担心编写循环包装。
NSMutableDictionary
,这是一个很好的解决方案。 - jose920405
Swift
语法进行迭代,请参考此帖子:https://dev59.com/zmAf5IYBdhLWcg3w9Wiu#24111700 - AechoLiu