通过NSDictionary遍历null值

我有一个特定的NSDictionary与几个键,但他们在适用于很多部门,如:

  1. 人:
    • 性别:
      • 名称:
        • 地址:
  2. 位置:

所以你可以看到,如果我在nsdictionary中插入这个,最初我只有两个键作为“个人”和“位置”,但我试图迭代每个键检查空值,并将其设置为@“”空的string。

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

谢谢

  • 你不能在NSDictionary存储一个nil 。 要么你会寻找[NSNull null]否则你会寻找字典,缺乏你正在寻找的钥匙….

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

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

recursion是答案,虽然没有显示recursion的答案是正确的。

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

最简单的forms是:

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

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

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

当你检查值时,在你的循环内部使用这个来检查null。

 if ([[dict objectForKey:@"Gender"] isKindOfClass:[NSNull class]]) { // null value myGender = @""; } 
 - (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"]; } } }