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

IOS: Почему я не могу установить значение nil в значение NSDictionary?

Это может быть очень простой вопрос, но мне было интересно, почему я не могу назначить nil как значение NSDictionary? У меня есть следующий оператор много мест в моем коде. Если [q objectForKey:@"text"] равно nil, приложение падает.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];

Я должен проверить всюду для nil, прежде чем назначать его в словарь. Это единственный правильный способ? Мне что-то не хватает?

if([q objectForKey:@"text"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
    [dict setObject:@"" forKey:@"text"];
4b9b3361

Ответ 1

Он хочет, чтобы фактический объект... использовал NSNull

Ответ 2

Вы можете установить значение nil с помощью setValue:forKey, но оно удаляет ключ.

Если вы хотите установить ключ в nil, вы можете использовать setValue:forKey:, который удалит ключ, если вы установите до nil (цитата из документации ниже). Обратите внимание на Значение вместо объекта.

setValue:forKey:

Добавляет заданную пару ключ-значение в словарь.

...
Обсуждение

Этот метод добавляет значение и ключ к словарю с помощью setObject:forKey:, если значение не равно nil, и в этом случае вместо этого метод пытается удалить ключ с помощью removeObjectForKey:.

Когда вы позже попытаетесь получить объект, используя objectForKey: для ключа, который вы удалили, установив его на nil, вы получите nil назад (цитата из документации ниже).

Возвращаемое значение:

Значение, связанное с aKey, или nil, если никакое значение не связано с aKey.

Примечание. Ключ фактически не будет присутствовать в словаре, поэтому он не будет получен с помощью allKeys; или перечислить.

Ответ 3

При использовании этого метода:

func setObject(_ anObject: Any, forKey aKey: NSCopying)

Параметры (в соответствии с документами Apple):

anObject

Вызывает исключение invalidArgumentException, если anObject равен нулю. Если тебе надо для представления значения nil в словаре используйте NSNull.

AKEY

Вызывает исключение invalidArgumentException, если aKey равен нулю.

Ответ 4

Друг, использующий nil как маркер, является признаком плохого программирования. nil зарезервирован для какой-то другой цели.

if([q objectForKey:@"text"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
    [dict removeObjectforKey:@"text"]; // this will do nothing if key does not exsist.

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

для проверки использования

if([dict objectforKey:@"text"] !=nil){} // this will work becuase default value is nil 
itself 

Ответ 5

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

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

dictionary[@"key"] = nil;

Вы заметили это?

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

/* this statement is safe to execute    */

dictionary[@"key"] = nil;

/* but this statement will crash application    */

[dictionary setObject:nil forKey:@"key"];