我想了解UIPageControl的工作方式。所以我下载此示例代码从苹果UIPageControlSampleCode它运行正常,但在下面的代码中的if语句的警告(使用赋值为不带括号的条件的结果):
- (id)initWithPageNumber:(int)page
{
if (self = [super initWithNibName:@"MainView" bundle:nil])
{
pageNumber = page;
}
return self;
}
现在的问题是:为什么开发商做这样的事?使得if语句条件的内部的分配?它是一个错误?
赋值运算符(=),除了用于进行分配,还返回分配的值。这是这样你就可以做的东西一样
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)
该警告是因为,示例代码已经被苹果公司创建,编译器和版本的默认编译器选项发生了变化。
特别是,该警告 - 告诉你,你可能意味着“==”代替“=”(因为该语句是一个“如果”条件,你一般测试相等的,而不是分配) - 是相当的逻辑;但警告是不是在编译器的早期版本和Xcode中的默认启用的,这就解释了为什么这样的代码可能仍然存在于旧的示例代码(没有人是完美的,甚至苹果developpers;))。
正确的正常使用/惯例则是:
if (nil != (self = [super initWithNibName:@"MainView" bundle:nil]))
if ((self = [super initWithNibName:@"MainView" bundle:nil]))
也能工作和删除警告。我建议采用第一种解决方案。如果您明确地测试,在分配之后,分配(从而self
值)的结果不是零,那么当你阅读代码(即使它是不是你的),你确定是什么用意。
即使如果保持这样的代码(并保持警告)的代码将工作,此警告确保你没有在你的代码输错“=”而不是“==”,因为这可能是一个常见的错误(新手也为可能键入太快有经验的程序员;)),所以我认为这是一件好事,它现在被激活,和一个很好的做法,以明确地使与零为清楚起见比较