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

假设我有这个:

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

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

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

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

这在Objective-C中是如何实现的?


当前回答

快速枚举在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" ...
}

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

其他回答

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

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

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

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

枚举字典最简单的方法是

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

tDictionary是你想要迭代的NSDictionary或NSMutableDictionary。