用于访问NSMutable字典的目标c中的每个循环

我在Objective-C中find访问可变字典键和值的一些困难。

假设我有这个:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init]; 

我可以设置键和值。 现在,我只想访问每个键和值,但我不知道键的数量。

在PHP中,这非常简单,如下所示:

 foreach ($xyz as $key => $value) 

在Objective-C中怎么可能?

 for (NSString* key in xyz) { id value = [xyz objectForKey:key]; // do stuff } 

这适用于每个符合NSFastEnumeration协议(可用于10.5+和iOS)的类,尽pipeNSDictionary是less数几个允许枚举键而不是值的集合之一。 我build议你阅读关于快速枚举 集合编程主题 。

哦,我应该补充说,你应该永远不要修改一个集合,而枚举通过它。

只是为了不遗漏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); }]; 

如果在枚举时需要改变字典:

 for (NSString* key in xyz.allKeys) { [xyz setValue:[NSNumber numberWithBool:YES] forKey:key]; } 

我build议你阅读枚举:遍历 cocoa集合编程指南中的集合 元素部分。 有你需要的示例代码。

枚举字典最简单的方法是

 for (NSString *key in tDictionary.keyEnumerator) { //do something here; } 

其中tDictionary是你想要迭代的NSDictionaryNSMutableDictionary

在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" ... } 

您不释放枚举器对象,并且不能重置它。 如果您想重新开始,则必须从字典中请求新的枚举器对象。

你可以使用-[NSDictionary allKeys]来访问所有的键并循环。