这两个实例类型初始化方法是否相等?
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) { ... }
测试 a
和 b
是否具有相同的值,如果是,则执行 if
中的语句。然而:
if (a = b) { ... }
将 b
中的值赋给 a
然后如果 a
和 b
的值(由于赋值它们具有相同的值)则执行语句) 是非零的。显然这两种行为是完全不同的。
如果编译器在 if
中看到单个 =
,它会发出警告,提醒程序员注意可能存在拼写错误。如果使用双括号,警告将被省略:
if ((a = b)) { ... }
这就是您会在代码中看到这种模式的原因。 HTH
我想知道这两个是否相等:
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) { ... }
测试 a
和 b
是否具有相同的值,如果是,则执行 if
中的语句。然而:
if (a = b) { ... }
将 b
中的值赋给 a
然后如果 a
和 b
的值(由于赋值它们具有相同的值)则执行语句) 是非零的。显然这两种行为是完全不同的。
如果编译器在 if
中看到单个 =
,它会发出警告,提醒程序员注意可能存在拼写错误。如果使用双括号,警告将被省略:
if ((a = b)) { ... }
这就是您会在代码中看到这种模式的原因。 HTH