在Objective-C中测试零——如果(x!=零)与如果(x)

在Objective-C中测试零——如果(x!=零)与如果(x),objective-c,syntax,Objective C,Syntax,我在网上找到的大多数例子都是这样写的: if(x != nil) // ... 这有什么问题吗 if(x) // ... 在Objective-C中,nil被定义为一个名为\uu DARWIN\u NULL的值,它在if语句中的计算结果本质上是0或false。因此,写作 if(x==nil)与写入if(!x)相同,写入if(x!=nil)等于if(x)(因为与false比较会产生一个否定,而与true比较会保持相同的条件) 您可以用任何一种方式编写代码,这实际上取决于您认为

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

if(x != nil)
    // ...
这有什么问题吗

if(x)
    // ...

在Objective-C中,
nil
被定义为一个名为
\uu DARWIN\u NULL
的值,它在if语句中的计算结果本质上是
0
false
。因此,写作
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)


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

两者都是相同的,这是一个风格问题,它归结为您是否喜欢:

  • 如果(某物){…}

  • 如果(某物){…}

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

    检查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;
    }  
    

    如果(someCondition==true)不被鼓励,我应该加上
    ,因为在C派生语言中,0以外的任何值原则上都可以被视为布尔真值,但是由于历史原因,如果
    someCondition
    -1
    并且
    true
    被定义为
    1
    ,那么
    someCondition==true
    的计算结果为false。@Yuji,这是正确的。不过,我试图暗示,
    someCondition
    的计算结果为布尔值,但这是一个重要的警告。正如他们所说,这两种形式都很好。但是,请注意,如果您试图将Obj-C引用转换为BOOL,则会出现一些微妙和危险的问题,如so if x==0中所述;如果(x)和(x!=nil)表现相同,他们会这样做吗?@erik是的,他们会
    nil
    本质上等于0,因此这些条件在(0)
    和(0!=0)的情况下计算为
    if(0)
    ,两者都为false。
    + (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
            }