Iphone PageControl示例代码中的警告:将赋值结果用作不带括号的条件
我试图理解UIPageControl的工作方式。所以我从苹果下载了这个示例代码 它运行正常,但在以下代码中的if语句中有一个警告(使用赋值结果作为不带括号的条件):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; } 现在我的问题是
- (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)