繁体   English   中英

if(self = [super init])与if((self = [super init]))

[英]if (self = [super init]) vs. if ((self = [super init]))

只是在进行代码审查,并开始怀疑:

我以为if (self = [super init])检查是否将[super init]返回值分配给变量self操作的值 )是否成功。 因此(self = nil)实际上是TRUE

我想if ((self = [super init]))检查赋值后self的值是什么( variable的值 )。 因此((self = nil))将为FALSE

初始化自己的类时,哪种方法是正确的? Apple文档使用的是前一种( 例如,在此处 ),而我现在正在实际使用这种样式。

他们俩都做同样的事情。 if评估的是它内部表达式的值,它是赋值中的赋值。 因此,当self不为零时,您进入if块。

第二种形式在其周围抛出括号,以使关于条件内部赋值的任何潜在编译器警告均保持沉默,这通常是一种不好的做法,而且可能是拼写错误。 但这是惯用的Objective-C,因此最好采用第一种方法。

正如其他人所说,在这种情况下,括号并不重要。 它们的作用在于您是否明确检查nil:

if (self = [super init] != nil) // wrong!

if ((self = [super init]) != nil) // right

!=的优先级比=高,因此在第一种情况下,您将[super init] != nil (可能为true)的布尔结果分配给self,然后对if进行测试。

就我个人而言,我也不在乎,但更喜欢在测试之外明确地进行作业。 这反映了我的编程背景,使我相信布尔值与整数和指针是不同的类型,并且赋值不是表达式,即使在C实现的情况下,我错了。

self = [super init];
if (self != nil) 

“赋值表达式具有赋值后的左操作数的值”(C99),因此无论哪种方式,赋值表达式都具有variable 多余的括号没有区别(警告可能除外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM