Inserting nil objects into an NSDictionary

jdog picture jdog · Dec 11, 2012 · Viewed 16.8k times · Source

If we have an API that requires only 2 out of an objects 5 properties and iPhone app doesn't require them to instantiate an object, when the object is used in the params NSDicitionary the app will crash. I was told NSDictionary will not let you assign nil values, as when it reaches nil it thinks its finished. Does objective-c have a way to spit out an objects non-nil properties into an NSDictionary?

Example:

[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

            }

This will crash when it gets to the stopped_drinking property. Any suggestions on how to handle this?

Answer

Paul.s picture Paul.s · Dec 11, 2012

It's a bit long winded but you could do

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),
}