Подтвердить что ты не робот

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 используется первая (например здесь), стиль которой я фактически использую сейчас.

4b9b3361

Ответ 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), поэтому в любом случае оно имеет значение переменной, как вы выразились. Дополнительные круглые скобки не имеют значения (кроме, возможно, для предупреждений).