将 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的主要内容,如果未能解决你的问题,请参考以下文章
尝试在objective-c中从objects[0]插入nil对象
NSManagedObject 的 managedObjectContext 属性为 nil