我开始发现我的代码到处都是:
if([p objectForKey@"somekey"] != [NSNull null]) {
}
NULL 是否有更短(按字符)的比较?
背景:我正在使用 SBJson 库来解析 JSON 字符串,并且某些键通常有空值(按设计)。
我开始发现我的代码到处都是:
if([p objectForKey@"somekey"] != [NSNull null]) {
}
NULL 是否有更短(按字符)的比较?
背景:我正在使用 SBJson 库来解析 JSON 字符串,并且某些键通常有空值(按设计)。
没有内置任何东西,但创建一个MYIsNull()
可以进行所需比较的函数是合理且简单的。只需考虑在缺少密钥的情况下要返回的内容。
您可能想换一种方式并转换-null
为nil
. 例如,您可以NSDictionary
像这样添加一个类别:
- (id)my_nonNullObjectForKey:(NSString *)key {
id value = [self objectForKey:key];
if ([value isEqual:[NSNull null]) {
return nil;
}
return value;
}
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!
不,您必须测试NSNull
. 但是,如果你发现你的代码被它弄得乱七八糟,你可能想#define
为它创建一个。
还要记住,如果p
为 nil,或者如果p
没有 的值someKey
,则[p objectForKey@"somekey"] != [NSNull null]
计算结果为YES
。
所以你可能想要这样的东西:
#define IsTruthy(X) ( X && (X != [NSNull null]) )
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.
由于您正在使用SBJSON
,您可以轻松更改其代码 - 您拥有源代码。
我实际上已经修改SBJSON
了解析器以跳过[NSNull null]
值。它们没有添加到字典中,当我打电话时objectForKey:
,我从来没有得到[NSNull null]
,我只是得到nil
。然后,在大多数情况下,我什至不必检查该值是否为,nil
因为调用方法nil
通常会给出我期望的结果。
如果您只是担心输入所需的时间,请考虑使用宏:
#define ISNULL(key) [p objectForKey:key] == [NSNull null]
然后
if (!ISNULL(@"somekey")) ...
很确定你可以说
if ([p objectForKey:@"somekey"]) {
}
我不太使用 NSNull,所以我不是 100% 确定,但我认为它测试为假,任何其他对象测试为真。