If (self = [super init]) vs. if ((self = [super init]))
Просто сделал обзор кода и начал задаваться вопросом:
Я думал, что if (self = [super init])
проверяет, было ли успешным или нет присвоение возвращаемого значения [super init]
переменной self
(значение операции). Таким образом, (self = nil)
будет фактически TRUE
.
Я думал, что if ((self = [super init]))
проверяет, что такое значение self
после присваивания (значение переменной). Таким образом, ((self = nil))
будет FALSE
.
Какой из них является правильным способом использования при инициализации ваших собственных классов? В документации Apple используется первая (например здесь), стиль которой я фактически использую сейчас.
Ответы
Ответ 1
Они оба делают то же самое. То, что оценивается if
, - это значение выражения внутри него, которое является назначенным значением в присваивании. Поэтому, когда self
не равно нулю, вы переходите к блоку if
.
Вторая форма бросает вокруг нее пары, чтобы заставить замолчать любые потенциальные предупреждения компилятора о назначениях внутри условных выражений, что обычно является плохой практикой и, возможно, опечаткой. Но это идиоматично Objective-C, поэтому для этого нужно сделать первый способ.
Ответ 2
Как говорили другие, круглые скобки не имеют значения в этом случае. Где они имеют значение, если вы явно проверяете nil:
if (self = [super init] != nil) // wrong!
if ((self = [super init]) != nil) // right
!= имеет более высокий приоритет, чем =, поэтому в первом случае вы присваиваете логический результат [super init] != nil
(возможно, true) для себя, а затем выполняете тест для if.
Лично я не забочусь ни о себе, но предпочитаю выполнять назначение явно за пределами теста. Это отражение моего фона программирования, который привел меня к убеждению, что булевы - это другой тип от целых чисел и указателей, и что назначения не являются выражениями, хотя в случае реализации C я ошибаюсь.
self = [super init];
if (self != nil)
Ответ 3
"Выражение присваивания имеет значение левого операнда после присвоения" (C99), поэтому в любом случае оно имеет значение переменной, как вы выразились. Дополнительные круглые скобки не имеют значения (кроме, возможно, для предупреждений).