If (self = [super init]) - предупреждение LLVM! Как вы с этим справляетесь?
До Xcode 4 с LLVM это передало компилятор незаметно. Назначение в условном выражении является совершенно преднамеренным и идиомой Cocoa.
Xcode 4 с выбранным компилятором LLVM никогда не перестает жаловаться, а не только во время компиляции, как только вы вводите его, появляется желтый значок предупреждения. Отключение предупреждений в виде ошибок и просто игнорирование предупреждения не кажется хорошей идеей. Перемещение назначения из круглых скобок оставляет пространство. Необходимость отключить это предупреждение с помощью прагмы для каждого нового проекта станет утомительной.
Как вы с этим справляетесь? Какова будет новая идиома?
Ответы
Ответ 1
Это на самом деле очень старое предупреждение, оно было просто отключено по умолчанию с GCC и Clang 1.6. Xcode действительно должен дать вам предложение о том, как его исправить, а именно, удвоить круглые скобки.
if ((self = [super init])) { ... }
Дополнительная пара паренов сообщает компилятору, что вы действительно намеревались сделать назначение в условном выражении.
Ответ 2
Если вы создаете метод init из новых макросов нового кода Xcode, вы заметите, что новый блаженный способ выполнить init:
- (id)init {
self = [super init];
if (self) {
<#initializations#>
}
return self;
}
Это позволяет избежать предупреждения. Хотя лично в моем собственном коде, если я сталкиваюсь с этим, я просто применяю метод, показанный Кевином.
Что-то хорошее знать!
Ответ 3
Просто используйте две пары круглых скобок, чтобы дать понять компилятору, который вы назначаете специально:
if ((self = [super init]))
Ответ 4
Поднимите навигатор проекта и выберите свой проект. В появившемся главном окне выберите "Все". В разделе "Компилятор LLVM 2.0 - Предупреждения" выберите "Другие предупреждающие флаги". Добавьте флаг "Wno-идиоматические-скобки" для "Debug" и "Release". Теперь очистите и перекомпилируйте. ![enter image description here]()
Ответ 5
Как некоторые другие предложили добавить дополнительный набор скобок.
Я далек от гуру регулярных выражений, поэтому не стесняйтесь очищать его, но это найти и заменить в Xcode, зафиксированном около 95% моих экземпляров:
Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With: if ((self =\1))
Будьте осторожны, потому что это также найдет if (self ==...), поэтому используйте предварительный просмотр и снимите отметку с них или исправьте мое регулярное выражение:)
И начните использовать self =...; если (сам), он чище.