将 nil 对象插入 NSDictionary

Posted

技术标签:

【中文标题】将 nil 对象插入 NSDictionary【英文标题】:Inserting nil objects into an 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 分配给它。 【参考方案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”的评论了。当我阅读您的答案时,当我看到您的评论时,它误导了我。

以上是关于将 nil 对象插入 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

iOS Pinterest 插入 nil 对象

尝试从 objects[0] 插入 nil 对象?

尝试在objective-c中从objects[0]插入nil对象

NSManagedObject 的 managedObjectContext 属性为 nil

当上下文为 nil 时,Swift Temp CoreData 对象无法设置 ivars

释放 NSArray 时将对象设置为 nil