我发现在Objective-C中访问可变字典键和值有些困难 .
假设我有这个:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
我可以设置键和值 . 现在,我只想访问每个键和值,但我不知道键的数量 .
在PHP中它非常简单,如下所示:
foreach ($xyz as $key => $value)
Objective-C怎么可能?
for (NSString* key in xyz) { id value = xyz[key]; // do stuff }
这适用于符合NSFastEnumeration协议(在10.5和iOS上可用)的每个类,但 NSDictionary 是少数几个可以枚举键而不是值的集合之一 . 我建议你在Collections Programming Topic中阅读fast enumeration .
NSDictionary
哦,我应该补充一点,你应该在枚举时修改一个集合 .
枚举字典的最简单方法是
for (NSString *key in tDictionary.keyEnumerator) { //do something here; }
其中 tDictionary 是您要迭代的 NSDictionary 或 NSMutableDictionary .
tDictionary
NSMutableDictionary
如果您在枚举时需要 mutate 字典:
for (NSString* key in xyz.allKeys) { [xyz setValue:[NSNumber numberWithBool:YES] forKey:key]; }
在10.5和iPhone OS中添加了快速枚举,它显着更快,而不仅仅是语法糖 . 如果你必须定位较旧的运行时(即10.4和向后),你将不得不使用旧的枚举方法:
NSDictionary *myDict = ... some keys and values ... NSEnumerator *keyEnum = [myDict keyEnumerator]; id key; while ((key = [keyEnum nextObject])) { id value = [myDict objectForKey:key]; ... do work with "value" ... }
您不释放枚举器对象,也无法重置它 . 如果要重新开始,则必须从字典中请求新的枚举器对象 .
只是不遗漏使用块枚举键和值的10.6选项...
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { NSLog(@"%@ = %@", key, object); }];
如果您希望操作同时发生:
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, id object, BOOL *stop) { NSLog(@"%@ = %@", key, object); }];
我建议你阅读Collections Programming Guide for Cocoa的Enumeration: Traversing a Collection’s Elements部分 . 您需要一个示例代码 .
您可以使用-[NSDictionary allKeys]访问所有密钥并循环访问它 .
7 回答
这适用于符合NSFastEnumeration协议(在10.5和iOS上可用)的每个类,但
NSDictionary
是少数几个可以枚举键而不是值的集合之一 . 我建议你在Collections Programming Topic中阅读fast enumeration .哦,我应该补充一点,你应该在枚举时修改一个集合 .
枚举字典的最简单方法是
其中
tDictionary
是您要迭代的NSDictionary
或NSMutableDictionary
.如果您在枚举时需要 mutate 字典:
在10.5和iPhone OS中添加了快速枚举,它显着更快,而不仅仅是语法糖 . 如果你必须定位较旧的运行时(即10.4和向后),你将不得不使用旧的枚举方法:
您不释放枚举器对象,也无法重置它 . 如果要重新开始,则必须从字典中请求新的枚举器对象 .
只是不遗漏使用块枚举键和值的10.6选项...
如果您希望操作同时发生:
我建议你阅读Collections Programming Guide for Cocoa的Enumeration: Traversing a Collection’s Elements部分 . 您需要一个示例代码 .
您可以使用-[NSDictionary allKeys]访问所有密钥并循环访问它 .