Просто делал обзор кода и начал задаваться вопросом:
Я думал if (self = [super init])
проверки, ли присвоение возвращаемого значения [super init]
к переменной self
было успешно или не (значение операции). Таким образом (self = nil)
на самом деле был бы TRUE
.
Я думал if ((self = [super init]))
проверки, что является значением self
после присвоения (значение переменной). Таким образом ((self = nil))
был бы FALSE
.
Какой корректный путь состоит в том, чтобы использовать при инициализации собственных классов? Документация Apple использует первого один (например, здесь), которые разрабатывают, я на самом деле использую теперь.
Они оба делают одно и то же. То, что вычисляет if
, - это значение выражения внутри него, которое является присвоенным значением в присваивании. Поэтому, когда self
не равно нулю, вы переходите к блоку if
.
Вторая форма окружает его скобками, чтобы заглушить любые потенциальные предупреждения компилятора о присваиваниях внутри условных выражений, что обычно является плохой практикой и, возможно, опечаткой. Но это идиоматический Objective-C, так что можно сделать это первым способом.
«Выражение присваивания имеет значение левого операнда после присваивания» (C99), поэтому в любом случае оно имеет значение переменной , как вы положи это. Дополнительные круглые скобки не имеют значения (кроме, возможно, предупреждений).
Как уже было сказано другими, скобки в данном случае не имеют значения. Они имеют значение, если вы явно проверяете на 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)