24

如果我们有一个 API 只需要对象 5 个属性中的 2 个,而 iPhone 应用程序不需要它们来实例化一个对象,那么当在参数 NSDicitionary 中使用该对象时,应用程序将崩溃。有人告诉我 NSDictionary 不会让你分配 nil 值,因为当它达到 nil 时,它认为它已经完成了。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

            }

当它到达stopped_drinking 属性时,这将崩溃。有关如何处理此问题的任何建议?

4

2 回答 2

61

这有点啰嗦,但你可以做

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),
}
于 2012-12-10T23:17:25.390 回答
7

您不能插入nil集合(字典、数组、索引集等)。

但是,您可以插入[NSNull null]它们,因为这就是它们的用途

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

编辑: Paul.s 为您的案例提供了一个很好的插入行为示例,包括三元运算符用法

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

于 2012-12-10T23:17:03.877 回答