0

是否有一种快速方法可以确定字典中的值是否为 NSNULL 而无需检查该对象类,例如

[[dict objectForKey:@"foo"] class] != [NSNull null];

4

3 回答 3

6

虽然你可以按照食人魔所说的去做,但最好使用:

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 编辑他们的帖子以使用身份比较之前编写的。

于 2015-07-24T16:28:03.190 回答
3

比较值,而不是类。

dict[@"foo"] == [NSNull null]

null方法返回一个单例实例NSNull。由于只NSNull分配了一个实例,因此您可以直接将该实例的地址与集合元素的地址进行比较,以确定它们中的任何一个在概念上是否为空。

于 2015-07-24T16:24:57.143 回答
1

实际上您发布的内容不正确,您正在将类 (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"]

您当然可以选择方法的名称和类别...

于 2015-07-24T16:24:09.813 回答