【问题标题】:Double parentheses in sample code示例代码中的双括号
【发布时间】:2010-07-24 00:20:09
【问题描述】:

我在 XCode 生成的示例和存根中看到很多这样的代码:

if ((self = [super init])) {
}

我不清楚条件中双括号的意图。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    为了扩展@Anders 评论,它保护您免受的具体问题如下:

    if (foo = x) { do_something() };
    

    90% 的时间这是一个错误。你的意思是说foo == x。但是有 10% 的情况下,您的真正意思是“将 x 分配给 foo,然后测试是否为真”。典型的例子是while (ch = getchar())。但是if (self = [super init]) 是另一个很好的例子。编译器假定这些事情是错误的并抛出警告,除非你用双括号告诉编译器你的意思是真的。

    就我个人而言,我就是这样做的:

    self = [super init];
    if (self != nil)
    {
      ...
    }
    return self;
    

    这是一个额外的行,但是当 init 调用很长时,它会让事情变得更清晰。

    顺便说一句,Big Nerd Ranch 出名的 Aaron Hillegas 向我们中的几个人提出了挑战,让我们想出任何这种self==nil 检查实际上很重要的案例。这些案例存在,但数量极少(您可以将self 添加为NSObservation 观察者,在这种情况下您不希望它是nil)。把它当作它的价值;在我的个人代码中,我经常跳过nil 检查,但在我的专业代码中,这是我团队标准的一部分。

    另外,出于某种原因,Apple 添加了一个额外的 gcc 选项 -Wmost 以关闭此警告。我猜有人不喜欢输入额外的括号。关闭它对我来说似乎是个坏主意。

    【讨论】:

      【解决方案2】:

      只是为了避免收到警告。

      【讨论】:

      • 幸运的是(现代)编译器会发出警告。在条件表达式中意外使用赋值与相等可能会引入许多错误——这些不应该被轻易忽略。
      • 是的,在 objc 中,当有警告时,它可能是非常严重的事情,所以去掉一些琐碎的事情会更容易发现讨厌的事情。
      猜你喜欢
      • 2014-08-10
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多