Обновление для Xcode 8.3 - Ошибка в компиляторе приводит к «Декларации затенения локальной переменной» в некоторых случаях, когда она преднамеренно ... и няня паникует.
Например, в Objective C:
Учитывая
typedef BOOL ( ^BoolBoolBlock ) ( BOOL );
И природа блоков Apple сделает любую переменную, объявленную в непосредственной внешней области для блока, глобальной для блока (псевдоглобальные).В результате в строке BOOL theResult = false;
:
- (BoolBoolBlock) boolBoolBlock {
BoolBoolBlock theResult = nil;
theResult = ^BOOL ( unused BOOL is ) {
BOOL theResult = false; // hides (shadows) the outer theResult (a good thing)
/*
call back code goes here,
all variables local in scope to this method are global to the block so be careful
*/
return theResult;
};
return theResult;
}
появляются предупреждения (и ошибки, если предупреждения == ошибки в ваших настройках). Няня видит, что BoolBoolBlock theResult = nil;
блокируется тенью от BOOL theResult = false;
, что на самом деленамеренно по двум причинам в этом случае:
- по соглашению в моем коде ВСЕ возвращаемые значения являются результатом, независимо от того, какие
- являются положительными побочными эффектами, потому что я морально против глобальных.
Другими словами, вся эта конструкция настроена так, чтобы блокировать псевдоглобальные механизмы Apple Blocks и создавать структуру в этом хаосе.Блокировка «theResult» метода от использования в блоке, который возвращает метод, является хорошей вещью ... все же няня имеет шипящий припадок.
Чтобы успокоить няню (избавьтесьпредупреждений или, возможно, ошибок, если у вас есть дисциплина, устанавливающая предупреждения как ошибки), вы просто вносите это изменение в свой файл проекта -> Настройки сборки -> фильтр «Прочие» -> Скрытые локальные переменные -> меняете на «Нет»... или визуально: