Ответ 1
Он хочет, чтобы фактический объект... использовал NSNull
Это может быть очень простой вопрос, но мне было интересно, почему я не могу назначить 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"];
Он хочет, чтобы фактический объект... использовал NSNull
setValue:forKey
, но оно удаляет ключ.Если вы хотите установить ключ в nil
, вы можете использовать setValue:forKey:
, который удалит ключ, если вы установите до nil
(цитата из документации ниже). Обратите внимание на Значение вместо объекта.
setValue:forKey:
Добавляет заданную пару ключ-значение в словарь.
Обсуждение...
Этот метод добавляет значение и ключ к словарю с помощью
setObject:forKey:
, если значение не равноnil
, и в этом случае вместо этого метод пытается удалить ключ с помощьюremoveObjectForKey:
.
Когда вы позже попытаетесь получить объект, используя objectForKey:
для ключа, который вы удалили, установив его на nil
, вы получите nil
назад (цитата из документации ниже).
Возвращаемое значение:Значение, связанное с aKey, или nil, если никакое значение не связано с aKey.
Примечание. Ключ фактически не будет присутствовать в словаре, поэтому он не будет получен с помощью allKeys
; или перечислить.
При использовании этого метода:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
Параметры (в соответствии с документами Apple):
anObject
Вызывает исключение invalidArgumentException, если anObject равен нулю. Если тебе надо для представления значения nil в словаре используйте NSNull.
AKEY
Вызывает исключение invalidArgumentException, если aKey равен нулю.
Друг, использующий 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
Вы можете установить нулевой объект таким образом:
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"];