如果我们的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属性时会崩溃。关于如何处理这个的任何建议?
答案 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在添加到集合时不会崩溃。