对于目标c中的每个循环,用于访问NSMutabledictionary

时间:2010-01-26 23:03:29

标签: objective-c nsdictionary enumeration nsmutabledictionary key-value

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

假设我有这个:

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

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

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

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

如何在Objective-C中实现?

7 个答案:

答案 0 :(得分:641)

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

这适用于符合NSFastEnumeration协议的每个类(可在10.5+和iOS上使用),但NSDictionary是少数几个可以枚举键而不是值的集合之一。我建议您阅读fast enumeration中的Collections Programming Topic

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

答案 1 :(得分:97)

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

答案 2 :(得分:13)

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

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

答案 3 :(得分:4)

我建议你阅读Enumeration: Traversing a Collection’s ElementsCollections Programming Guide for Cocoa部分。有一个示例代码可供您使用。

答案 4 :(得分:4)

枚举字典的最简单方法是

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

其中tDictionary是您想要迭代的NSDictionaryNSMutableDictionary

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

您可以使用-[NSDictionary allKeys]访问所有密钥并循环访问它。