将nil对象插入NSDictionary

时间:2012-12-10 23:08:52

标签: objective-c nsdictionary

如果我们的API只需要对象中的2个属性,并且iPhone应用程序不要求它们实例化对象,则当对象在参数NSDicitionary中使用时,应用程序将崩溃。我被告知NSDictionary不会让你分配nil值,因为当它达到nil时它会认为它已经完成了。 objective-c是否有办法将对象非零属性吐出到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

            }

当它到达stopped_drinking属性时会崩溃。关于如何处理这个的任何建议?

2 个答案:

答案 0 :(得分:57)

这有点长,但你可以做到

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

答案 1 :(得分:6)

您无法将nil插入集合(字典,数组,索引集等)。

但是,您可以将[NSNull null]插入其中,因为这是what they made it for

将对象插入字典变得非常容易(如果属性为nil,则插入NSNull代替。然后,当从字典中提取内容时,快速if(myReturnedObject == [NSNull null])会告诉您返回的值是否有效,因为NSNull是单例,因此每个NSNull实际上都是同一个对象

编辑:Paul.s为您的案例提供了一个很好的插入行为示例,其中包含ternary operator usage

再次编辑:尽管有以下评论,但事实证明在上面链接的Apple文档中,NSNull在添加到集合时不会崩溃。