NSDictionary 检查 null
Posted
技术标签:
【中文标题】NSDictionary 检查 null【英文标题】:NSDictionary check for null 【发布时间】:2015-07-24 16:16:58 【问题描述】:有没有一种快速的方法来确定字典中的值是否为 NSNULL 而无需检查对象类,如
[[dict objectForKey:@"foo"] class] != [NSNull null];
【问题讨论】:
不知道为什么投反对票,其他问题和答案不是很令人满意。 这可能对***.com/a/21982611/210171 有帮助(我给出的关于处理 w 空值的答案) (即你可以做类似id found = [dict[@"foo"] ifNullThenNil]
的事情)
以上测试不检查null。
【参考方案1】:
虽然你可以按照食人魔所说的去做,但最好使用:
id someObject = [dict objectForKey:@"foo"];
if (someObject != [NSNull null])
//do something
由于 [NSNull null] 是一个单例,并且其中只有一个存在,因此您可以执行直接比较。这是此处文档中使用的内容:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html
要测试空对象值,您必须进行直接对象比较。
这是首选方法。
编辑:这是在 Ogres 编辑他们的帖子以使用身份比较之前编写的。
【讨论】:
【参考方案2】:比较值,而不是类。
dict[@"foo"] == [NSNull null]
null
方法返回 NSNull
的单例实例。由于只分配了一个 NSNull
实例,因此您可以直接将该实例的地址与集合元素的地址进行比较,以确定它们是否在概念上为空。
【讨论】:
为什么,因为它的操作较少?两种方式 AFAICS 的结果相同 @quantumpotatoNSNull
的null
类方法返回一个单例引用,它允许您在此处进行身份比较。【参考方案3】:
实际上你发布的内容是不正确的,你正在将类( NSNull )与这个类的单例实例( NSNull null )进行比较,
正确的是
[[dict objectForKey:@"foo"] isKindOfClass:[NSNull class]];
或比较实例
[dict objectForKey:@"foo"] == [NSNull null];
但是如果你有很多这样的调用,你可以创建一个 NSDictionary 类别并在那里添加方法,比如
- (BOOL)nl_isNSNullAt:(id)key
return [[self objectForKey:key] isKindOfClass:[NSNull class]];
或带有实例
- (BOOL)nl_isNSNullAt:(id)key
return [self objectForKey:key] == [NSNull null];
那么就可以直接访问了
[dict nl_isNSNullAt:@"foo"]
你当然可以选择方法名和类别...
【讨论】:
是的,好的,我会这样做.. 只是希望有办法解决它。谢谢 为了与 Cocoa 编码指南保持一致,该方法的更好名称是isNullForKey:
。但是,请注意,您在框架类的类别中添加的方法应始终以您的项目前缀为前缀,例如xyz_isNullForKey:
.以上是关于NSDictionary 检查 null的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 NSDictionary 中的值是不是存在于字典数组中