警告在的PageControl示例代码:使用分配的结果为没有括号的情况

问题描述 投票:0回答:2

我想了解UIPageControl的工作方式。所以我下载此示例代码从苹果UIPageControlSampleCode它运行正常,但在下面的代码中的if语句的警告(使用赋值为不带括号的条件的结果):

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

现在的问题是:为什么开发商做这样的事?使得if语句条件的内部的分配?它是一个错误?

iphone if-statement warnings condition assignment-operator
2个回答
1
投票

赋值运算符(=),除了用于进行分配,还返回分配的值。这是这样你就可以做的东西一样

a = b = 1;

这对于编译器是一样的书写

a = (b = 1);

这就意味着,当

self = <some init function>;

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

究其原因,警告的是,它很容易在if语句来代替(==)意外地使用(=):

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

因此,编译器正试图保护你从这个错误。

出于这个原因,我喜欢做的条件明确,在您的示例:

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

0
投票

该警告是因为,示例代码已经被苹果公司创建,编译器和版本的默认编译器选项发生了变化。

特别是,该警告 - 告诉你,你可能意味着“==”代替“=”(因为该语句是一个“如果”条件,你一般测试相等的,而不是分配) - 是相当的逻辑;但警告是不是在编译器的早期版本和Xcode中的默认启用的,这就解释了为什么这样的代码可能仍然存在于旧的示例代码(没有人是完美的,甚至苹果developpers;))。

正确的正常使用/惯例则是:

  • 无论是明确的“如果”条件测试平等,是明确的编译器,这是肯定的,你的意思:if (nil != (self = [super initWithNibName:@"MainView" bundle:nil]))
  • 或者也由编译器所接受的符号,以双倍的括号提及,制作条件与简单的分配,而不是“==”是不是一个错误。因此,写if ((self = [super initWithNibName:@"MainView" bundle:nil]))也能工作和删除警告。

我建议采用第一种解决方案。如果您明确地测试,在分配之后,分配(从而self值)的结果不是零,那么当你阅读代码(即使它是不是你的),你确定是什么用意。


即使如果保持这样的代码(并保持警告)的代码将工作,此警告确保你没有在你的代码输错“=”而不是“==”,因为这可能是一个常见的错误(新手也为可能键入太快有经验的程序员;)),所以我认为这是一件好事,它现在被激活,和一个很好的做法,以明确地使与零为清楚起见比较

© www.soinside.com 2019 - 2024. All rights reserved.