if (self = [super init]) против if ((self = [super init])) - PullRequest
20 голосов
/ 17 июня 2010

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 17 июня 2010

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

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

12 голосов
/ 17 июня 2010

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

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

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

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

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

self = [super init];
if (self != nil) 
4 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...