在 Objective-C 中测试 nil —— if (x! = nil) vs if (x)

我在网上找到的大多数例子都是这样写的:

if(x != nil)
// ...

有什么问题吗?

if(x)
// ...

我在一个简单的程序中同时尝试了两种方法,但没有发现任何不同。

41638 次浏览

在 Objective-C 中,nil被定义为一个称为 __DARWIN_NULL的值,它在 if 语句中基本上等于 0false。因此,写作 if (x == nil)与写入 if (!x)相同,写入 if (x != nil)等于 if (x)(因为与 false比较会产生负值,而与 true比较则保持相同的条件)。


您可以以任何一种方式编写代码,这实际上取决于您认为哪种方式更具可读性。我觉得 if (x)更有意义,但这取决于你的风格。

这就像比较 if (someCondition == true)if (someCondition)
一切都取决于你,以及谁来读代码。


编辑: 正如 Yuji 正确提到的,因为 Objective-C 是 C 的一个超集,任何求值为0以外的值的条件都被认为是真,因此,如果上面例子中的 someCondition被求值为一个整数值,比如说,-1,将其与 true进行比较将得到 false,而 if 语句将不会被求值。有些事情需要注意。

都有

if (x != nil)

还有

if ( x )

是等价的,所以选择变体,在您看来,使您的代码更 可读为您(和其他人谁将阅读和支持您的代码)

两者都是一样的,这是一个时尚问题,归结起来就是你是否更喜欢:

  1. 如果(某事){ ... }

    VS

  2. 如果(什么! = 没有){ ... }

我总是发现 # 1更加清晰,但 # 2在文档和字段中被广泛使用,因此最好既了解这两种形式,又适应项目使用的形式,并在风格上保持一致。

检查零的最好和安全的方法是
创建一个通用的方法,并添加所有这些 无效:

+ (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string {
NSString *stringSource = [NSString stringWithFormat:@"%@",string];
if ([stringSource isEqualToString:@"(null)"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<null>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<nil>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isKindOfClass:[NSNull class]]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@""]) {
stringSource = @"";
return stringSource;
}
if (stringSource == nil) {
stringSource = @"";
return stringSource;
}
NSString *stringFinal = [stringSource stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
return stringFinal;
}

检查

NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]];
if (![strUuid isEqualToString:@""]) {
// do your stuff
}