【问题标题】:looping through an NSMutableDictionary循环遍历 NSMutableDictionary
【发布时间】:2010-10-12 11:55:54
【问题描述】:

无论键如何,如何循环遍历 NSMutableDictionary 中的所有对象?

【问题讨论】:

    标签: objective-c ios nsmutabledictionary


    【解决方案1】:

    标准方式如下所示

    for(id key in myDict) {
        id value = [myDict objectForKey:key];
        [value doStuff];
    }
    

    【讨论】:

    • 如果有这样的方法就好了:for (id key, value in myDict) 那将是完美的。
    • 最好遍历键(即id key in myDict.allKeys),而不是字典。这允许您改变字典,这可能是您想要做的。
    【解决方案2】:

    你可以使用

    [myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
        // do something with key and obj
    }];
    

    如果您的目标操作系统支持块。

    【讨论】:

      【解决方案3】:

      您可以使用[dict allValues] 获取您的值的NSArray。请注意,它不保证调用之间的任何顺序。

      【讨论】:

      • 我会在(字典中的 id 键)上使用这个,特别是在可变字典上,因为如果字典在枚举时被修改,后者会抛出一个令人讨厌的错误。
      • “它不保证” - 这是经常需要的(大多数语言都有一个版本的字典可以保证顺序) - 它在实践中是否保持顺序?跨度>
      • @Adam 在 MacOS X 上,我的顺序很混乱(不是插入顺序,不是字母顺序,什么都没有),但调用之间是一致的。
      • 如果映射无关紧要,为什么要使用 NSDictionary?
      • @stephen 通常它在某处很重要,而在其他地方不重要。您还可以获得在某些情况下可能有用的唯一键约束。
      【解决方案4】:
      1. 对于简单循环,快速枚举比基于块的循环快一点
      2. 使用基于块的枚举比使用快速枚举更容易进行并发或反向枚举 使用 NSDictionary 循环时,您可以使用基于块的枚举器一次性获取键和值,而使用快速枚举时,您必须使用键在单独的消息发送中检索值

      在快速枚举中

      for(id key in myDictionary) {
         id value = [myDictionary objectForKey:key];
        // do something with key and obj
      }
      

      在块中:

      [myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
      
         // do something with key and obj
        }];
      

      【讨论】:

        【解决方案5】:

        您不需要为变量赋值。您可以通过myDict[key] 直接访问它。

            for(id key in myDict) {
                NSLog(@"Key:%@ Value:%@", key, myDict[key]);
            }
        

        【讨论】:

          【解决方案6】:

          另一种方法是使用字典枚举器。以下是来自 Apple 的一些示例代码:

          NSEnumerator *enumerator = [myDictionary objectEnumerator];
          id value;
          
          while ((value = [enumerator nextObject])) {
              /* code that acts on the dictionary’s values */
          }
          

          【讨论】:

            猜你喜欢
            • 2011-02-23
            • 1970-01-01
            • 2020-11-17
            • 2020-06-15
            • 1970-01-01
            • 2023-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多