Двойные скобки в примере кода - PullRequest
8 голосов
/ 24 июля 2010

Я вижу много кода, подобного этому, в примерах и в заглушках, которые генерирует XCode:

if ((self = [super init])) {
}

Мне непонятно, что подразумевается в двойных скобках в условных выражениях.

Ответы [ 2 ]

7 голосов
/ 24 июля 2010

Чтобы расширить комментарий @Anders, конкретная проблема, от которой он защищает вас, выглядит следующим образом:

if (foo = x) { do_something() };

90% времени это ошибка. Ты хотел сказать foo == x. Но в 10% случаев вы действительно имели в виду «назначить x для foo, а затем проверить на правду». Канонический случай этого - while (ch = getchar()). Но if (self = [super init]) - еще один хороший пример. Компилятор предполагает, что такие вещи являются ошибками, и выдает предупреждение, если вы не скажете компилятору, что вы действительно имели это в виду, используя двойные скобки.

Лично я просто делаю это так:

self = [super init];
if (self != nil)
{
  ...
}
return self;

Это лишняя строка, но она немного яснее, когда вызов init длинный.

Кроме того, Аарон Хиллегасс из известности Ранчо Большого Ботаника бросил вызов нескольким из нас, чтобы придумать любой случай, в котором эта проверка self==nil действительно имела значение. Случаи существуют, но их невероятно мало (вы можете добавить self в качестве наблюдателя NSObservation, и вы не хотели бы, чтобы в этом случае было nil). Возьми это за то, что оно стоит; в моем личном коде я часто пропускаю проверку nil, но в моем профессиональном коде это часть стандарта моей команды.

В качестве еще одной причины, Apple почему-то добавила дополнительную опцию gcc -Wmost, которая отключает это предупреждение. Я предполагаю, что кто-то там не любил вводить дополнительные скобки. Мне кажется плохой идеей отключить его.

2 голосов
/ 24 июля 2010

Это просто, чтобы избежать предупреждения.

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