首页 文章

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

提问于
浏览
254

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

假设我有这个:

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

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

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

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

Objective-C怎么可能?

7 回答

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

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

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

  • 627

    枚举字典的最简单方法是

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

    其中 tDictionary 是您要迭代的 NSDictionaryNSMutableDictionary .

  • 96

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

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

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

  • 1

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

    我建议你阅读Collections Programming Guide for CocoaEnumeration: Traversing a Collection’s Elements部分 . 您需要一个示例代码 .

  • 3

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

相关问题