我开始发现我的代码中充斥着:
if([p objectForKey@"somekey"] != [NSNull null]) {
}
有没有更短的(按字符计算)比较方法来判断 NULL?
背景:我正在使用 SBJson 库来解析一个 JSON 字符串,但其中某些键经常出现 null 值(这是设计如此的)。
我开始发现我的代码中充斥着:
if([p objectForKey@"somekey"] != [NSNull null]) {
}
有没有更短的(按字符计算)比较方法来判断 NULL?
背景:我正在使用 SBJson 库来解析一个 JSON 字符串,但其中某些键经常出现 null 值(这是设计如此的)。
虽然没有内置的方法,但创建一个名为MYIsNull()
的函数来实现您想要的比较是合理且简单的。只需要考虑在键缺失的情况下要返回什么。
您也可以将-null
转换为nil
。例如,可以在NSDictionary
上添加一个类别,如下所示:
- (id)my_nonNullObjectForKey:(NSString *)key {
id value = [self objectForKey:key];
if ([value isEqual:[NSNull null]) {
return nil;
}
return value;
}
nil
,并且能够使用我们通常的模式,比如if (!myString) ...
是一个很大的优势。 - bdeshamNSDictionary
中添加该类别前缀。 - bbum我会使用
if([[p objectForKey@"somekey"] isEqual:[NSNull null]] || ![p objectForKey@"somekey"]) {
// NSNull or nil
} else {
// Stuff exists...Hurray!
}
看起来它能工作,因为[NSNull null]
实际上是一个“对象”。希望能对你有所帮助!
NSNull
。但是,如果你发现你的代码被它弄得很混乱,你可能想要为其创建一个#define
。p
是nil,或者p
没有someKey
的值,那么[p objectForKey@"somekey"] != [NSNull null]
评估为YES
。#define IsTruthy(X) ( X && (X != [NSNull null]) )
有没有更短的NULL比较方式(字符方面)?
[NSNull null]
是13个字符。你可以说:
NSNull.null // << 11
(id)kCFNull // << 11
IsNSNull([p objectForKey@"somekey"]) // << 10 in this case and requires no ==, !=
[p objectForKey@"somekey"].mon_isNSNull // << 13 in this case, but requires no ==, !=
在处理 nil
接收器时,请注意如何命名该类别。
如果你只是担心打字所花费的时间,可以考虑使用宏:
#define ISNULL(key) [p objectForKey:key] == [NSNull null]
那么
if (!ISNULL(@"somekey")) ...
由于您正在使用SBJSON
,因此您可以轻松更改其代码 - 您拥有源代码。
我实际上修改了SBJSON
解析器以跳过[NSNull null]
值。它们不会添加到字典中,当我调用objectForKey:
时,我永远不会得到[NSNull null]
,我只会得到nil
。然后,在大多数情况下,我甚至不必检查该值是否为nil
,因为在nil
上调用方法通常会给出我期望的结果。
我相信你可以直接说
if ([p objectForKey:@"somekey"]) {
}
我不常使用NSNull,所以我不能百分之百确定,但我认为它测试为假,而任何其他对象测试为真。
NSNull
,则此测试将通过。这个if语句相当于 if ([p objectForKey:@"someKey"] == nil )
。 - Mike D
[NSNull null]
,则返回该值。 - Rob Napier@"someKey"
中的对象是NSNull
。 - Mike D