对于Objective-C中用于访问NSMutable字典的每个循环

对于Objective-C中用于访问NSMutable字典的每个循环,objective-c,nsdictionary,enumeration,nsmutabledictionary,key-value,Objective C,Nsdictionary,Enumeration,Nsmutabledictionary,Key Value,我发现在Objective-C中访问可变字典键和值时有些困难 假设我有这个: NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init]; 我可以设置关键点和值。现在,我只想访问每个键和值,但我不知道设置了多少个键 在PHP中非常简单,如下所示: foreach ($xyz as $key => $value) 在Objective-C中如何实现这一点?我建议您阅读本文的部分。这里有一个示例代码供您使用 for (NSStri

我发现在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
是少数允许您枚举键而不是值的集合之一。我建议你在报纸上读一下


哦,我应该补充一点,在枚举集合时,你不应该修改集合。

你可以使用它来访问所有的键并在其中循环。

快速枚举是在10.5和iPhone操作系统中添加的,它的速度明显更快,不仅仅是语法上的。如果必须针对较旧的运行时(即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" ...
}
for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}

您不能释放枚举器对象,也不能重置它。如果要重新开始,必须从字典中请求一个新的枚举器对象。

只是为了不遗漏使用块枚举键和值的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);
}];

如果需要在枚举时对字典进行变异,请执行以下操作:

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" ...
}
for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}

列举字典最简单的方法是

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

其中
tDictionary
是您要迭代的
NSDictionary
NSMutableDictionary

这些都是很好的链接,不过如果您可以为10.5+或iPhone构建的话,@zneak发布的代码要简单得多,也要快得多。通过字典枚举的3种不同方法。嘿,这让我想起了“最奇怪的语言特性”的答案,VB有7种不同的循环。。。objectEnumerator是在1994年添加的,for(…in…)是在大约2006年添加的,块是在2009年添加的。枚举的块形式是自然的结果。这似乎比构造中…的标准更快:@lkraider,我在那篇文章上发表了评论,它实际上将基于块的枚举与旧的for循环相比较,而不是for…in构造。停止是为了什么?你如何利用它?有参考吗?是的,但这确实会创建一个额外的自动释放数组,这可能是相当浪费的,尤其是对于有很多键的字典。我想知道,它是否应该是:for(NSString*key in[xyz allKeys])??或者这真的无关紧要。@user76859403枚举字典实际上就是枚举键
for(NSString*key in[xyz allKeys])
在概念上是相同的。如果在枚举键时需要修改字典,请使用[xyz allKeys]。请看下面我的答案。这个循环是否始终返回相同的订单?还是我们需要另一种方式来使用它来处理TableView部分?@ymutlu,可可字典是无序的。这意味着每当您修改它们时,它们的迭代顺序可能会改变。原因是
allKeys
返回一个键的副本。所以对字典进行变异是安全的。