Подтвердить что ты не робот

Словарь NSDictionarayWithObjectsAndKeys, добавляющий значение NULL

Я хочу создать NSDictionary с + [Словарь NSDictionaryWithObjectsAndKeys:]. Один из моих ключей имеет строку, но иногда строка может быть nil. Если строка nil, любые другие пары ключей значений, которые я помещаю после этого, будут игнорироваться, потому что список преждевременно прекращается. Каков стандартный способ справиться с возможностью того, что в NSDictionary может быть значение с nil?

4b9b3361

Ответ 1

Вам нужно проверить, является ли строка нулевой. Если это так, добавьте [NSNull null] вместо вашей строки.

Ответ 2

Создание объектов NSDictionary может быть комбинационным, если у вас много объектов, если они не равны нулю, не следует включать в словарь.

Для меня NSNull - такая же большая проблема, как и решение. При создании объектов NSDictionary для использования в других объектах вы можете использовать два способа при использовании значений nil. Либо вы добавляете объекты NSNull в словарь, а затем проверяете значения NSNull при чтении значений. Это делает довольно сложный код в момент создания, но при чтении значений он становится беспорядочным. Ex. следует ли проверять все ключи в словаре или какие-либо гарантии, что они не ноль? И если значение NSNull не отфильтровано, оно обязано делать исключения при попытке отправить сообщения объекта.

Второй способ - просто не добавлять значения NSNull в словарь. Это удобно при чтении NSDictionary, поскольку [someDictionary objectForKey: someKey] просто возвращает ноль, когда ключ не установлен. Этот подход делает это довольно легко при чтении значений, но на самом деле он должен быть грязным кодом при создании. Ex. Создание NSMutableDictionary, проверка на nil перед добавлением значений и, наконец, возвращение неизменяемой копии?

Решение

Для меня было решение создать две категории, что в сущности облегчает как создание, так и чтение.

При создании NSDictionary вы просто обертываете ваши возможные значения nil, такие как

[NSDictionary dictionaryWithObjectsAndKeysIngoringNull:
 [NSNull nullWhenNil:val1], @"value1",
 [NSNull nullWhenNil:val2], @"value2",
 ...
 nil];

Этот код почти такой же простой, как и подход номер один, но он значительно упрощает чтение значений.

Категории следующие (работает как с ARC, так и с кодом, отличным от ARC):

Добавление NSDictionary:

@implementation NSDictionary (NullAddition)

+ (id)dictionaryWithObjectsAndKeysIngnoringNull:(id)firstObject, ... {

    NSMutableArray* objects = [NSMutableArray array];
    NSMutableArray* keys = [NSMutableArray array];

    va_list args;
    va_start(args, firstObject);

    for (id object = firstObject; object; object = va_arg(args, id)) {

        id key = va_arg(args, id);

        if (!key)
            break;

        if (![object isKindOfClass:[NSNull class]]) {
            [objects addObject:object];
            [keys addObject:key];
        }

    }

    va_end(args);

    return [self dictionaryWithObjects:objects forKeys:keys];

}

@end

Добавление NSNull

@implementation NSNull (NullAddition)

+ (id)nullWhenNil:(id)obj {

    return (obj ? obj : [self null]);

}

@end

Удачи!

Ответ 3

Попытка вставить данные (ключ или значение) в NSDictionary приведет к ошибке времени выполнения. Поэтому вам не нужно иметь дело с нулевыми данными в словаре.

'-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Test)'

и

'-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'

Однако это означает, что вы несете ответственность за проверку достоверности данных перед тем, как поместить их в словарь для предотвращения сбоев.