【问题标题】:Testing for nil in Objective-C -- if(x != nil) vs if(x)在 Objective-C 中测试 nil -- if(x != nil) vs if(x)
【发布时间】:2011-05-30 14:47:19
【问题描述】:

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

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

这有什么问题吗?

if(x)
    // ...

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

【问题讨论】:

    标签: objective-c syntax


    【解决方案1】:

    在 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(someCondition==true) 是不鼓励的,因为在 C 派生语言中,除了 0 之外的任何值原则上都可以视为布尔真值,但由于历史原因如果 someCondition-1true 定义为 1 然后 someCondition==true 评估为 false。
    • @Yuji,没错。不过,我试图暗示 someCondition 的计算结果为布尔值,但这是一个重要的警告。
    • 查看 Apple 文档中的“使用 nil”部分:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…。正如他们所说,两种形式都很好。但是,请注意,如果您尝试将 Obj-C 引用 cast 到 BOOL,则会出现微妙和危险的问题,如 mikeash.com/pyblog/… 中所述
    • 所以如果 x==0; if(x) 和 if(x!=nil) 的行为是否相同?
    • @erik 是的,他们应该这样做。 nil 本质上等于 0,因此这些条件的计算结果为 if (0)if (0 != 0),两者都是错误的。
    【解决方案2】:

    两者

    if (x != nil)
    

    if ( x )
    

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

    【讨论】:

      【解决方案3】:

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

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

      2. if (something != nothing) { ... }

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-12-23
          • 1970-01-01
          • 2011-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多