Objective-C - 选择哪种语法?

3
你认为哪种语法更好/更易读?
if(!myViewController.view.superview)

或者:

if(myViewController.view.superview == nil)

Thanks!!

4个回答

8

我使用第二种形式,因为这样意图更加清晰。


8
两者非常接近,取决于个人口味或所涉项目的编码规范。
说!myViewController.view.superview意思是“没有superview”非常清楚。
说myViewController.view.superview == nil意味着superview为nil也很清楚。
我可能更喜欢前者,因为如果我用英语写,我会说:
如果没有superview,那么
我不会说
如果superview什么都没有,那么
但它们如此接近,完全等效,以至于甚至不值得保持一致。别误会,我总体上支持一致性,只是两者之间的可读性几乎没有区别。

0

从个人角度来看,我长期以来使用后一种表达式,但是反过来。使用“foo == nil”(或nil == foo,以避免因忘记一个“=”而引起的错误)更加学究。最终你会厌倦输入它,而且第一个版本也免疫了意外的nil赋值错误。

对于新编码者来说,在他们编写代码时详细说明它是好的,因为这提供了实践,迫使他们思考发生了什么,但是后来,当然要切换到一个更快的版本,如果它是等效的。

如果出于某种疯狂的原因,空指针不再是0,而是其他无效值(存在整个巨大的内存区域作为无效指针),那么使用'!'将不再起作用,但这永远不会发生(或者如果发生了,他们将为编译器添加支持以重载'!',以便在与对象指针一起使用时表示“无效”,并且无论如何都会执行正确的操作,否则Objective-C开发者将变得疯狂)。

唯一微妙的问题是,它可能开始训练你混淆C布尔表达式的值与其他类型的值,它们并不相同。因此,如果您开始认为布尔表达式只是一个BOOL,那么您可能会假设将任何非零值分配给BOOL变量将实现您想要的效果,但事实并非如此。由于BOOL只是一个char(目前),如果您执行以下操作:
    - (BOOL)checkFoo {
  BOOL foo = [bar count]; // imagine count is > 255
    if(foo)
      [self doSomething];
    return foo;
}

当将256或更高的数字隐式转换为BOOL时,通过截断得到的结果是零(NO),而不是您想要的YES。

    - (BOOL)checkFoo {
  BOOL foo = ([bar count] > 0);
    if(foo)
      [self doSomething];
    return foo;
}

或者

- (BOOL)checkFoo {
    if([bar count]) {
      [self doSomething];
      return YES;
    }
    return NO;
}

我想说的是,请确保您理解背景和细微差别。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接