если (сам = [супер init]), по сравнению с если ((сам = [супер init]))

Просто делал обзор кода и начал задаваться вопросом:

Я думал if (self = [super init]) проверки, ли присвоение возвращаемого значения [super init] к переменной self было успешно или не (значение операции). Таким образом (self = nil) на самом деле был бы TRUE.

Я думал if ((self = [super init])) проверки, что является значением self после присвоения (значение переменной). Таким образом ((self = nil)) был бы FALSE.

Какой корректный путь состоит в том, чтобы использовать при инициализации собственных классов? Документация Apple использует первого один (например, здесь), которые разрабатывают, я на самом деле использую теперь.

21
задан RaffAl 16 February 2014 в 16:26
поделиться

3 ответа

Они оба делают одно и то же. То, что вычисляет if , - это значение выражения внутри него, которое является присвоенным значением в присваивании. Поэтому, когда self не равно нулю, вы переходите к блоку if .

Вторая форма окружает его скобками, чтобы заглушить любые потенциальные предупреждения компилятора о присваиваниях внутри условных выражений, что обычно является плохой практикой и, возможно, опечаткой. Но это идиоматический Objective-C, так что можно сделать это первым способом.

20
ответ дан 29 November 2019 в 20:51
поделиться

«Выражение присваивания имеет значение левого операнда после присваивания» (C99), поэтому в любом случае оно имеет значение переменной , как вы положи это. Дополнительные круглые скобки не имеют значения (кроме, возможно, предупреждений).

4
ответ дан 29 November 2019 в 20:51
поделиться

Как уже было сказано другими, скобки в данном случае не имеют значения. Они имеют значение, если вы явно проверяете на nil:

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

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

!= имеет более высокий приоритет, чем =, поэтому в первом случае вы присваиваете булев результат [super init] != nil (вероятно, истинный) self, а затем выполняете проверку для if.

Лично мне не нравится ни тот, ни другой вариант, но я предпочитаю выполнять присваивание явно вне теста. Это отражение моего опыта программирования, который привел меня к убеждению, что булевы числа отличаются от целых чисел и указателей, и что присваивания не являются выражениями, хотя в случае реализации на C я ошибаюсь.

self = [super init];
if (self != nil) 
13
ответ дан 29 November 2019 в 20:51
поделиться