这两个实例类型初始化方法是否相等?

Are these two instancetype initialization methods equal?

我想知道这两个是否相等:

if 语句中的单括号:

- (instancetype)init {
    
    if (self = [super init]) {
        
        // ...
    }
    
    return self;
}

if 语句中的双括号:

- (instancetype)init {
    
    if ((self = [super init])) {
        
        // ...
    }
    
    return self;
}

是的,......因为它只取决于被比较的表达式,无论存在多少括号(应该是偶数)

括号 帮助编译器理解具有优先级的表达式,objective c 中的 if 语句至少需要一个 () ,而添加更多会起作用也有,但没用

是的,它们是相等的。

self 正在获取它需要在 [super init] 调用后存储的引用。这两个做同样的事情。

它们是相同的,因为它们意味着相同的事情并生成相同的代码,但是编译器的行为会略有不同。

在类似 C 的语言中,一个容易在视觉上难以发现的打字错误是输入 =,即 assignment,当 == 时,即是equality,是有意的。这个错误会产生非常不同的结果并且很难发现错误。例如:

if (a == b) { ... }

测试 ab 是否具有相同的值,如果是,则执行 if 中的语句。然而:

if (a = b) { ... }

b 中的值赋给 a 然后如果 ab 的值(由于赋值它们具有相同的值)则执行语句) 是非零的。显然这两种行为是完全不同的。

如果编译器在 if 中看到单个 =,它会发出警告,提醒程序员注意可能存在拼写错误。如果使用双括号,警告将被省略:

if ((a = b)) { ... }

这就是您会在代码中看到这种模式的原因。 HTH