【问题标题】:Iterating through NSDictionary for null value遍历 NSDictionary 以获取空值
【发布时间】:2012-01-18 15:38:52
【问题描述】:

我有一个带有几个键的特定 NSDictionary,但它们在招聘方面非常深入,例如:

  1. 人员:
    • 性别:
      • 姓名:
        • 地址:
  2. 地点:

所以你可以看看我是否将它插入到 nsdictionary 中,最初我只有两个键作为“Person”和“Location”,但是我试图在每个键中迭代以检查空值并将其设置为@"" 空字符串。

有谁知道如何遍历这样的部门?

谢谢

【问题讨论】:

    标签: iphone objective-c ios cocoa ipad


    【解决方案1】:
    • 您不能将nil 存储在NSDictionary 中。要么您要查找 [NSNull null],要么您要查找缺少您要查找的键的字典....

    • enumerateKeysAndObjectsUsingBlock:for( ... in ...) 快。

    • 如果要修改字典的内容,则必须使用可变字典。如果您从属性列表中取消归档,则可以选择使用不可变节点创建可变容器(这可能是您想要的)。

    递归就是答案,尽管没有一个显示递归的答案是正确的。

    - (void)filterMutableDictionary:(NSMutableDictionary*)aDictionary
    {
          // check if aDictionary is missing any keys here
          if (![aDictionary objectForKey:@"DesiredKey"]) {
              ... fill in key/value here ...
          }
    
          // enumerate key/values, filtering appropriately, recursing as necessary
          [aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
                if ([value isKindOfClass: [NSMutableDictionary class]]) {
                    [self filterMutableDictionary: value];
                } else {
                    ... filter value here ...
                }
          }];
    }
    

    【讨论】:

      【解决方案2】:

      最简单的形式:

      [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
          if ([obj isKindOfClass:[NSNull class]]) [dictionary setValue:[NSString stringWithString:@""] forKey:key];
      } ];
      

      【讨论】:

      • 与 NSDictionary 一起使用。不必是可变的。
      【解决方案3】:

      您可以使用递归方法,如下所示:

      - (void)recursive:(NSDictionary*)aDictionary {
      
          for (id key in aDictionary) {
      
              id value = [aDictionary objectForKey:key];
      
              if ([value isKindOfClass:[NSDictionary class]]) {
                  [self recursive:value];
              } else {
                  // Do something else, the value is not a dictionary
              }
          }
      
      }
      

      【讨论】:

      • 只是好奇你是不是忘了 * 在 NSDictionary 之后?我遇到编译器错误。顺便说一句,过程非常好。
      【解决方案4】:

      在您的循环中,当您检查值时,使用它来检查 null。

      if ([[dict objectForKey:@"Gender"] isKindOfClass:[NSNull class]]) {
         // null value
         myGender = @"";
      }
      

      【讨论】:

        【解决方案5】:
        - (void)recursive:(NSDictionary)dictionary {
        
            for (NSString *key in [dictionary allKeys]) {
        
                id nullString = [dictionary objectForKey:key];
        
                if ([nullString isKindOfClass:[NSDictionary class]]) {
                    [self recursive:(NSDictionary*)nullString];
                } else {
                    if ( (NSString*)nullString == nil)
                        [dictionary setObject:@"" forKey:@"key"];
                }
            }
        
        }
        

        【讨论】:

        • 这行不通,因为您正在与nil 进行比较。您不能将nil 存储在字典中。如果字典中有空值,它们将是 [NSNull null] 单例。
        • 吉姆,你不能在这里寻找 isKindOfClass:[NSNull class] 而不是 == nil 吗?
        • @kforkarim 这就是吉姆的意思;但您不需要检查isKindOfClass:[NSNull null],因为只有一个单身人士。使用isEqual: 在技术上是正确的。此外,该代码不会编译; NSDictionary 不可变,(NSDictionary) 无效。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        相关资源
        最近更新 更多