【问题标题】:warning in the PageControl sample code: Using the result of an assignment as a condition without parenthesesPageControl 示例代码中的警告:使用赋值结果作为不带括号的条件
【发布时间】:2011-11-27 14:03:36
【问题描述】:

我试图了解 UIPageControl 的工作方式。所以我从 Apple 下载了这个示例代码 UIPageControlSampleCode 它运行良好,但在以下代码中的 if 语句中有一个警告(使用赋值结果作为不带括号的条件):

- (id)initWithPageNumber:(int)page 
{
    if (self = [super initWithNibName:@"MainView" bundle:nil])
    {
        pageNumber = page;
    }
    return self;
}

现在我的问题是:为什么开发人员会做这样的事情?在 if 语句条件内进行赋值?这是一个错误吗?

【问题讨论】:

    标签: iphone if-statement warnings conditional-statements assignment-operator


    【解决方案1】:

    此警告是因为示例代码是由 Apple 创建的,因此编译器的版本和默认编译器选项已更改。

    特别是,这个警告——它告诉你你的意思可能是“==”而不是“=”(因为该语句处于“if”条件下并且你通常测试相等而不是赋值)——相当逻辑;但是在以前版本的编译器和 Xcode 中默认情况下不会激活警告,这就解释了为什么这些代码可能仍然存在于旧的示例代码中(没有人是完美的,即使是 Apple 开发人员; )).

    那么正确的正常用法/惯例是

    • 要么在“if”条件下显式测试相等性,要么对编译器明确,以便它确定你的意思:if (nil != (self = [super initWithNibName:@"MainView" bundle:nil]))
    • 或者编译器也接受的一种表示法是双括号,以说明使用简单赋值而不是“==”来创建条件不是错误。因此,写 if ((self = [super initWithNibName:@"MainView" bundle:nil])) 也可以并删除警告。

    我建议采用第一种解决方案。 如果您在分配之后明确测试分配的结果(因此self 中的值)不为零,那么当您阅读代码时(即使它不是您的),您就可以确定预期的目的.


    即使您以这种方式保留代码(并保留警告),即使代码可以正常工作,此警告也可确保您没有在代码中错误输入“=”而不是“==”,因为这样可能是一个常见的错误(对于新手,但对于可能打字太快的有经验的程序员;))所以我认为它现在被激活是一件好事,并且为了明确与 nil 进行比较是一个好习惯清晰

    【讨论】:

      【解决方案2】:

      赋值运算符 (=) 除了执行赋值外,还返回赋值。这样你就可以做类似的事情了

      a = b = 1;
      

      对于编译器来说和写的一样

      a = (b = 1);
      

      这意味着在做的时候

      self = <some init function>;
      

      您可以通过将赋值放在 if 语句中来检查 init 是否成功。如果成功,则返回一个有效指针,该指针不为零,这意味着 if 语句的条件为真。如果初始化失败,则返回 nil,实际上为零,因此继续其余的初始化没有意义。

      警告的原因是在 if 语句中很容易意外使用 (=) 而不是 (==):

      if ( a = 1 ) // Should be a == 1
      {
          // Do important stuff
      }
      

      所以编译器试图保护你免受这个错误的影响。

      因此,在您的示例中,我更喜欢明确说明条件:

      if ((self = [super initWithNibName:@"MainView" bundle:nil]) != nil)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 2012-11-09
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多