对于Objective-C中用于访问NSMutable字典的每个循环
我发现在Objective-C中访问可变字典键和值时有些困难 假设我有这个:对于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
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
返回一个键的副本。所以对字典进行变异是安全的。