Итерация по NSDictionary для нулевого значения - PullRequest
1 голос
/ 12 декабря 2011

У меня есть определенный NSDictionary с парой ключей, но они очень много работают в таких отделах, как:

  1. лицо:
    • Пол:
      • Имя:
        • Адрес:
  2. Расположение:

Таким образом, вы можете видеть, вставляю ли я это в nsdictionary, изначально у меня просто есть два ключа: «Person» и «Location», однако я пытаюсь перебрать каждый из ключей, чтобы проверить нулевое значение и установить его в @ "" пустая строка.

Кто-нибудь знает, как пройти через такой отдел?

Спасибо

Ответы [ 5 ]

6 голосов
/ 12 декабря 2011
  • Вы не можете хранить 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 ...
            }
      }];
}
5 голосов
/ 01 марта 2012

В простейшем виде:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    if ([obj isKindOfClass:[NSNull class]]) [dictionary setValue:[NSString stringWithString:@""] forKey:key];
} ];
2 голосов
/ 12 декабря 2011

Вы можете использовать рекурсивный метод, например:

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

}
0 голосов
/ 12 декабря 2011
- (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"];
        }
    }

}
0 голосов
/ 12 декабря 2011

Внутри вашего цикла, когда вы проверяете значения, используйте это для проверки на ноль.

if ([[dict objectForKey:@"Gender"] isKindOfClass:[NSNull class]]) {
   // null value
   myGender = @"";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...