【问题标题】:Inserting nil objects into an NSDictionary将 nil 对象插入 NSDictionary
【发布时间】:2012-12-10 23:08:51
【问题描述】:

如果我们的 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 属性时会崩溃。有关如何处理此问题的任何建议?

【问题讨论】:

  • 为什么不使用其他值?也许为 NULL?
  • 如何为 NSDate 添加 NULL?
  • 只需像其他任何操作一样将 NULL 分配给它。

标签: objective-c nsdictionary


【解决方案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),
}

【讨论】:

  • return 行不应该是return object ? object : [NSNull null];吗?
  • @rmaddy 你试过了吗?这是同一件事的简写,我认为实际上非常简洁
  • 我实际上试图找出这是否是一些有效的速记但没有找到任何东西。奇怪的是我没有尝试。我不相信这是个好主意。不过很高兴知道。
  • 您认为这可能不是一个好主意的任何原因?我一直在使用它,但我仍然有点犹豫不决。
  • @rmaddy 我猜我来自 Ruby 我已经习惯了这种使用 'a ||= default'
【解决方案2】:

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

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

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

编辑: Paul.s 为您的案例提供了一个很好的插入行为示例,并附有 ternary operator usage

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

【讨论】:

  • CrimsonDiego - 现在您可以删除您的评论,因为不再有“loretoparisi”的评论了。当我阅读您的答案时,当我看到您的评论时,它误导了我。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2013-10-28
  • 2023-03-29
  • 2017-12-16
  • 2012-01-30
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多