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 = ...; если (само), это чище.