if(self = [super init]) - предупреждение LLVM! Как вы справляетесь с этим?

До Xcode 4 с LLVM это прошло компилятором незамеченным. Назначение в условных условиях является совершенно преднамеренным и идиома Какао.

Xcode 4 с выбранным компилятором LLVM никогда не перестает жаловаться, и не только во время компиляции, как только вы набираете его, появляется желтый значок предупреждения. Отключать предупреждения как ошибки и просто игнорировать предупреждение не кажется хорошей идеей. Перемещение присваивания из круглых скобок тратит впустую пространство. Отключение этого предупреждения с прагмой для каждого нового проекта станет утомительным.

Как вы справляетесь с этим? Какой будет новая идиома?

5 ответов

Решение

На самом деле это очень старое предупреждение, оно было отключено по умолчанию в GCC и в Clang 1.6. На самом деле Xcode должен дать вам подсказку, как это исправить, а именно - двойные скобки.

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

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

Если вы создадите метод init из более новых текстовых макросов XCode, вы заметите, что новый благословенный способ инициализации:

- (id)init {
    self = [super init];
    if (self) {
        <#initializations#>
    }
    return self;
}

Это позволяет избежать предупреждения. Хотя лично в своем коде, если я сталкиваюсь с этим, я просто применяю метод, который показал Кевин.

Что-то хорошее, чтобы знать!

Просто используйте две пары круглых скобок, чтобы было ясно, что компилятор назначает вас специально:

if ((self = [super init]))

Откройте навигатор проекта и выберите свой проект. В появившемся главном окне выберите "Все". В разделе "Компилятор LLVM 2.0 - Предупреждения" выберите "Другие флаги предупреждения". Добавьте флаг "Wno-idiomatic-круглые скобки" для "Debug" и "Release". Теперь очистите и перекомпилируйте.

Как некоторые другие предложили вам добавить дополнительный набор скобок.

Я далёк от гуру регулярных выражений, поэтому не стесняйтесь убирать это, но в Xcode исправлено около 95% моих примеров:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With:    if ((self =\1))

Будьте осторожны, потому что это также найдет if (self == ...), так что используйте предварительный просмотр и снимите флажки с них или исправьте мое регулярное выражение:)

И начать использовать self = ...; если (само), это чище.

Другие вопросы по тегам