8

我开始发现我的代码到处都是:

if([p objectForKey@"somekey"] != [NSNull null]) {

}

NULL 是否有更短(按字符)的比较?

背景:我正在使用 SBJson 库来解析 JSON 字符串,并且某些键通常有空值(按设计)。

4

7 回答 7

7

没有内置任何东西,但创建一个MYIsNull()可以进行所需比较的函数是合理且简单的。只需考虑在缺少密钥的情况下要返回的内容。

您可能想换一种方式并转换-nullnil. 例如,您可以NSDictionary像这样添加一个类别:

- (id)my_nonNullObjectForKey:(NSString *)key {
   id value = [self objectForKey:key];
   if ([value isEqual:[NSNull null]) {
     return nil;
   }
   return value;
}
于 2013-06-07T17:18:52.803 回答
5

I would use

if([[p objectForKey@"somekey"] isEqual:[NSNull null]] || ![p objectForKey@"somekey"]) {
    // NSNull or nil
} else {
    // Stuff exists...Hurray!
}

It seem to work since [NSNull null] is in fact an "object". Hope it helps!

于 2013-06-07T17:18:35.710 回答
3

不,您必须测试NSNull. 但是,如果你发现你的代码被它弄得乱七八糟,你可能想#define为它创建一个。

还要记住,如果p为 nil,或者如果p没有 的值someKey,则[p objectForKey@"somekey"] != [NSNull null]计算结果为YES

所以你可能想要这样的东西:

#define IsTruthy(X) ( X && (X != [NSNull null]) )
于 2013-06-07T17:24:43.503 回答
1

Is there shorter (character-wise) comparison for NULL?

[NSNull null] is 13 chars. You can say:

NSNull.null // << 11
(id)kCFNull // << 11

Or make a function:

IsNSNull([p objectForKey@"somekey"]) // << 10 in this case and requires no ==, !=

Or (cringes) use a category:

[p objectForKey@"somekey"].mon_isNSNull // << 13 in this case, but requires no ==, !=

Just be careful how you name that category when dealing with nil receivers.

于 2013-06-07T18:42:25.843 回答
0

由于您正在使用SBJSON,您可以轻松更改其代码 - 您拥有源代码。

我实际上已经修改SBJSON了解析器以跳过[NSNull null]值。它们没有添加到字典中,当我打电话时objectForKey:,我从来没有得到[NSNull null],我只是得到nil。然后,在大多数情况下,我什至不必检查该值是否为,nil因为调用方法nil通常会给出我期望的结果。

于 2013-06-08T15:11:47.363 回答
0

如果您只是担心输入所需的时间,请考虑使用宏:

#define ISNULL(key) [p objectForKey:key] == [NSNull null]

然后

if (!ISNULL(@"somekey")) ...
于 2013-06-08T15:41:52.503 回答
-4

很确定你可以说

if ([p objectForKey:@"somekey"]) {

}

我不太使用 NSNull,所以我不是 100% 确定,但我认为它测试为假,任何其他对象测试为真。

于 2013-06-07T17:11:27.573 回答