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

Вставка нулевых объектов в NSDictionary

Если у нас есть API, для которого требуется только 2 из объектов 5 свойств и приложение для iPhone, им не требуется, чтобы они создавали экземпляр объекта, когда объект используется в параметрах NSDicitionary, приложение будет аварийно завершено. Мне сказали, что NSDictionary не позволит вам назначать нулевые значения, так как когда он достигает нуля, он думает, что его закончили. Имеет ли objective-c способ выплескивать объекты не-nil-свойств в NSDictionary?

Пример:

[Drunk alloc] init];
drunk.started_drinking = [NSDate date];
drunk.stopped_drinking (we don't set this because he is still a drunk)
drunk.fat = YES;
drunk.dumb = YES;


parameters:@{

             @"auth_token" :token,
             @"name" : drunk.name, @"date_started" : drunk.started_drinking,
             @"date_stopped" : drunk.stopped_drinking, 
             @"prescribing_doctor" : drunk.fat,
             @"pharmacy" : drunk.dumb

            }

Это приведет к сбою, когда он перейдет в свойствостановочное_разрушение. Любые предложения о том, как с этим справиться?

4b9b3361

Ответ 1

Это немного длиннее, но вы могли сделать

static id ObjectOrNull(id object)
{
  return object ?: [NSNull null];
}

parameters:@{
  @"auth_token"         : ObjectOrNull(token),
  @"name"               : ObjectOrNull(drunk.name),
  @"date_started"       : ObjectOrNull(drunk.started_drinking),
  @"date_stopped"       : ObjectOrNull(drunk.stopped_drinking),
  @"prescribing_doctor" : ObjectOrNull(drunk.fat),
  @"pharmacy"           : ObjectOrNull(drunk.dumb),
}

Ответ 2

Вы не можете вставить nil в коллекции (словари, массивы, наборы индексов и т.д.).

Однако вы можете вставить [NSNull null] в них, поскольку это что они сделали для

Вставка объектов в словарь становится довольно простой (если свойство nil, вместо этого вставьте NSNull). Затем, вытаскивая вещи из словаря, быстрый if(myReturnedObject == [NSNull null]) скажет вам, верно ли возвращаемое значение, поскольку NSNull является одноэлементным и, следовательно, каждый NSNull фактически является тем же самым объектом.

Изменить: У Paul.s отличный пример поведения вставки для вашего случая, в котором используется тройное использование оператора.

Изменить снова:. Несмотря на приведенный ниже комментарий, это фактически подтверждено в документах Apple, связанных выше, что NSNull не сбой при добавлении в коллекции.