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

时间:2011-05-30 14:47:19

标签: objective-c syntax

我在网上发现的大部分例子都写道:

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

这有什么问题吗?

if(x)
    // ...

我在一个简单的程序中尝试了两个,但没有发现任何差异。

5 个答案:

答案 0 :(得分:121)

在Objective-C中,nil被定义为一个名为__DARWIN_NULL的值,它基本上在if语句中求值为0false。因此,写作 if (x == nil)与撰写if (!x)相同,写if (x != nil)等于if (x)(因为与false比较会产生否定,并与{{1}进行比较保持条件相同)。


您可以用任何一种方式编写代码,这实际上取决于您认为哪些代码更具可读性。我发现true更有意义,但这取决于你的风格。

这就像比较if (x)if (someCondition == true) 这一切都取决于你,谁将会阅读代码。


编辑:正如Yuji正确提到的那样,由于Objective-C是C的超集,因此任何计算为0以外的值的条件都被认为是真的,因此,如果{{1在上面的示例中,要计算为-1的整数值,将其与if (someCondition)进行比较会导致someCondition,并且不会计算if语句。需要注意的事情。

答案 1 :(得分:8)

两个

if (x != nil)

if ( x )

是等效的,因此请选择您认为使您的代码更强可读的变体(以及其他将阅读和支持您的代码的人)

答案 2 :(得分:0)

两者都是一样的,这是一个风格问题,归结为你是否愿意:

  1. if(something){...}

  2. if(something!= nothing){...}
  3. 我总是发现#1更清晰,但#2广泛用于文档和字段中,因此最好既知道两种形式又适应项目使用的内容并保持风格一致。

答案 3 :(得分:0)

检查nil的最佳和安全方法是
设置一个通用方法,并添加所有这些 null

   A    B  C
0  X  Foo  X
1           
2  X  Foo  X

然后检查

+ (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;
}  

答案 4 :(得分:-3)

if([yourNullObject isKindOfClass:[NSNull class]]){
    //if it is null
}else{
    //if it is not null
}