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 的结果相同 @quantumpotato NSNullnull 类方法返回一个单例引用,它允许您在此处进行身份比较。【参考方案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 检查 null

如何从NSDictionary数组中检查bool值

如何检查 NSDictionary 中字符串的前缀?

如何检查 NSDictionary 中的值是不是存在于字典数组中

检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8

NSPredicate (nsdictionary+array+nsdictionary)