В чем разница между этими двумя фрагментами инициализации? Который правильный? - PullRequest
1 голос
/ 05 августа 2009

Просматривая некоторый код, я нашел два разных фрагмента кода для инициализации. Я имею в виду не имена методов, а круглые скобки.

У этого есть только два из них:

if (self = [super initWithFrame:frame]) {

Вот так я и делаю все время, и, похоже, это работает. Теперь в примере Apple, я нашел это:

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

Должен ли я поместить это дважды в круглые скобки здесь? Или это просто в одной паре скобок, как в первом примере?

Ответы [ 4 ]

2 голосов
/ 05 августа 2009

В некоторых языках if (foo = bar) подразумевает, что назначение было применено правильно. Итак, звонки:

if( ( foo = bar ) )

оценит присваивание и вернет результат как external (), действующий как LHS, т. Е.

blah = foo = bar

внешний () акт вроде как бла.

В ANSI C и его дочерних C ++ и Objective-C это не является строго обязательным. Однако, как уже упоминалось, некоторые компиляторы выдают предупреждение, так как type-o "=" / "==" может быть неприятным. Этот тип-о привел к тому, что идиома размещения константы или константы в левой части вызывала проблему времени компиляции:

if( nil == foo )

если обе стороны являются переменными, хотя это все еще возможно ошибка.

Для этого есть веская причина, хотя gcc не предупреждает вас и не оценивает вещи иначе.

Если вы пишете код в командной среде, ваши коллеги могут быть не уверены, что вы имели в виду «=» или просто неправильно набрали «==», что заставляет их более внимательно смотреть на то, что вы делаете, даже если в этом нет необходимости. В стиле «напиши один раз, чтобы прочитать 1000 раз» ты вставляешь подсказки, чтобы люди не тратили время на чтение твоего кода. Например, используйте четкие и прописанные имена переменных (в наши дни экономия на байтах!). Не используйте тупые и чрезмерно оптимизированные конструкции в областях, которые не снижают производительность, - пишите свой код аккуратно.

В этом случае используйте (()), чтобы указать, что вы знали, это было "=" не "==".

Не забывайте, Apple пишет свои примеры для чтения не только дюжиной людей, но и потенциально каждым мужчиной, женщиной и ребенком на земле, чтобы читать сейчас и в будущем. Ясность имеет первостепенное значение.

2 голосов
/ 05 августа 2009

Одна пара скобок просто отлично

Я называю их " скобки паранойи ":)

РЕДАКТИРОВАТЬ: некоторые компиляторы C / C ++ выдают предупреждение из-за использования оператора присваивания (он скажет что-то вроде «ты имел в виду ==»?). Использование дополнительных скобок предотвращает это предупреждение. Но XCode не показывает такого рода предупреждения, поэтому в этом нет необходимости.

1 голос
/ 05 августа 2009

Похоже, ошибка вырезать и вставить для меня! (Или любителю Lisp.) Нет веской причины иметь вторую пару скобок, но, как вы заметили, это на самом деле не вредно.

0 голосов
/ 05 августа 2009

Если у меня есть это право, первый проверяет, что присвоение self = [super initWithFrame:frame] происходит , а второй проверяет, что результат этого присвоения true

Но это может быть просто нехватка чая ...

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