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


72

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

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

这有什么问题吗?

if(x)
    // ...

我在一个简单的程序中都尝试过,但没有发现任何区别。

Answers:


127

在Objective-C中,nil被定义为一个名为的值__DARWIN_NULL,该值本质上等于0或等于falseif语句。因此,写作 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语句。有一点要注意。


12
我要补充一点if(someCondition==true),不鼓励这样做,因为在C派生的语言中,原则上可以将除0以外的任何值视为布尔值true,但是由于历史原因,如果someConditionis-1trueis定义为1then则得出someCondition==truefalse。
Yuji

@Yuji,那是正确的。我试图暗示的是,它的someCondition值为布尔值,但这是一个重要的警告。
伊泰·费伯

1
检查Apple文档中的“使用零”部分:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…。正如他们所说,两种形式都很好。但是,你要谨慎,含蓄,奸诈的问题,如果你尝试施放一个OBJ-C参考BOOL,如在mikeash.com/pyblog/...

1
所以如果x == 0; if(x)和if(x!= nil)会表现得一样吗?
erik 2014年

@erik是的,他们应该。nil基本上等于0,因此这些条件求和到if (0)if (0 != 0),这两个都是错误的。
Itai Ferber

8

if (x != nil)

if ( x )

是等价的,因此请选择一种变体,以使您(以及其他将阅读和支持您的代码的人)对您的代码更具可读性


0

两者相同,这是一个样式问题,归结为您是否喜欢:

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

  2. 如果(某事!=没有){...}

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


-1

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

+ (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
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.