Iphone PageControl示例代码中的警告:将赋值结果用作不带括号的条件

Iphone PageControl示例代码中的警告:将赋值结果用作不带括号的条件,iphone,if-statement,warnings,conditional-statements,assignment-operator,Iphone,If Statement,Warnings,Conditional Statements,Assignment Operator,我试图理解UIPageControl的工作方式。所以我从苹果下载了这个示例代码 它运行正常,但在以下代码中的if语句中有一个警告(使用赋值结果作为不带括号的条件): - (id)initWithPageNumber:(int)page { if (self = [super initWithNibName:@"MainView" bundle:nil]) { pageNumber = page; } return self; } 现在我的问题是

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

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

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

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

特别是,这个警告——它告诉您可能是指“==”而不是“=”(因为该语句处于“if”状态,并且您通常测试相等性而不是赋值)——非常符合逻辑;但是在早期版本的编译器和Xcode中,默认情况下没有激活该警告,这解释了为什么这些代码可能仍然存在于旧的示例代码中(没有人是完美的,即使是苹果的开发人员;)

正确的正常用法/惯例是:

  • 或者在“if”条件下显式地测试相等性,显式地对编译器进行测试,以便它确定您的意思:
    if(nil!=(self=[super initWithNibName:@“MainView”bundle:nil])
  • 或者,编译器也接受的一种表示法是,将括号加倍,以说明使用简单赋值而不是“==”生成条件不是错误的。因此,编写
    if((self=[super initWithNibName:@“MainView”bundle:nil])
    也会起作用并删除警告
我建议采用第一种解决办法。 如果您在赋值后明确测试赋值结果(因此
self
中的值)不是零,那么当您阅读代码(即使它不是您的代码)时,您可以确定预期的结果


<>即使代码保持这种方式(并保持警告),这个警告确保您在代码中没有误入“=”而不是'==',因为这可能是一个常见的错误(对于新手来说,也可能是经验丰富的程序员输入的太快了),所以我认为现在激活它是一件好事。为了清晰起见,明确地与nil进行比较是一种良好的实践

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

a = b = 1;
对于编译器来说,这与编写

a = (b = 1);
这意味着

self = <some init function>;
因此,编译器正试图保护您不受此错误的影响

因此,在您的示例中,我更倾向于明确条件:

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