通过NSDictionary迭代null值

时间:2011-12-12 16:51:58

标签: iphone objective-c ios cocoa ipad

我有一些带有几把钥匙的NSDictionary,但是他们在雇佣部门的部门很多,例如:

  1. 人:
    • 性别:
      • 名称:
        • 地址:
  2. 位置:
  3. 所以你可以看看我是否在nsdictionary中插入它,最初我只有两个键作为“Person”和“Location”,但是我试图迭代每个键来检查空值并将其设置为@“”空字符串。

    有谁知道如何迭代这样的部门?

    由于

5 个答案:

答案 0 :(得分:6)

  • 您无法在nil中存储NSDictionary。要么你正在寻找[NSNull null],要么你会找到缺少你正在寻找的钥匙的字典....

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

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

Recurse是答案,但是没有显示递归的答案是正确的。

- (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 ...
            }
      }];
}

答案 1 :(得分:5)

以最简单的形式:

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

答案 2 :(得分:2)

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

- (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
        }
    }

}

答案 3 :(得分:0)

在检查值时,在循环内部使用它来检查null。

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

答案 4 :(得分:0)

- (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"];
        }
    }

}