我知道nsdictionary需要一个键来获取值。但是我如何在NSDictionary中遍历所有的键和值,这样我就知道有什么键,有什么值?我知道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 *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.
}];
带有自动补全功能的设置非常快,而且你也不用担心写迭代信封。
推荐文章
- Xcode构建失败“架构x86_64未定义的符号”
- 如何使用Xcode创建。ipa文件?
- 动态改变UILabel的字体大小
- registerForRemoteNotificationTypes: iOS 8.0及以上版本不支持
- 新的自动引用计数机制是如何工作的?
- 如何测试对象在Objective-C中的类?
- 在iPhone上确定用户是否启用了推送通知
- 是否有可能禁用浮动头在UITableView与UITableViewStylePlain?
- 从Cocoa应用程序执行一个终端命令
- 错误ITMS-9000:“冗余二进制文件上传。火车1.0版本已经有一个二进制版本上传。
- Swift -转换为绝对值
- Swift编译器错误:“框架模块内的非模块化头”
- 从父iOS访问容器视图控制器
- 自定义dealloc和ARC (Objective-C)
- 调整UITableView的大小以适应内容