Вы на самом деле может объявлять переменные внутри переключателя, если вы делаете это в соответствии с синтаксисом языка. Вы получаете сообщение об ошибке, потому что «case 0:
» является ярлыком, а в C незаконно иметь объявление как первый оператор после метки - обратите внимание, что компилятор ожидает выражение, такое как вызов метода, обычный присваивание и т. д. (возможно, это может быть странно, но это правило.)
Когда вы ставите NSLog(), вы избегаете этого ограничения. Вы можете заключить содержимое фрейма в фигурные скобки {}, чтобы ввести блок видимости, или вы можете переместить объявление переменной за пределы коммутатора. Вы выбираете вопрос личного предпочтения. Просто имейте в виду, что переменная, объявленная в {} скобках, действительна только в пределах этой области, поэтому любой другой код, который ее использует, должен также отображаться в этих скобках.
Edit:
Кстати, эта особенность не так редко, как вы могли бы подумать. В C и Java, это также запрещено использовать локальные переменные декларации в качестве одинокого заявления (что означает «не в фигурных скобках) в для, то время как или сделать петли, или даже в случае и else. (На самом деле это рассматривается в головоломке № 55 от "Java Puzzlers", которую я очень рекомендую.) Я думаю, что мы вообще не пишем таких ошибок, потому что не имеет смысла объявлять переменную как единственное утверждение в таких ситуациях. С переключатель/корпус конструкции, однако, некоторые люди опускают скобки, так как перерывИнструкцияявляется критическим заявлением для потока управления.
Чтобы увидеть компилятор бросать припадки, скопировать этот ужасающий, бессмысленный фрагмент кода в ваш (код) объективно-C:
if (1)
int i;
else
int i;
for (int answer = 1; answer <= 42; answer ++)
int i;
while (1)
int i;
do
int i;
while (1);
Еще одна причина, чтобы всегда использовать {} скобки, чтобы разграничить тело таких конструкций. :-)
Это было предложено (по крайней мере) дважды: http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement HTTP: // stackoverflow.com/questions/1115304/can-i-declare-variables-inside-an-objective-c-switch-statement –
Верно, но оба эти вопроса по-прежнему открыты. Я не вижу проблемы с тем, чтобы позволить этому одному - не нужно голосовать, чтобы закрыть его ... –
Адам, в то время как другое сообщение отвечает на ошибку, оно не касалось факта, что выражение в качестве первого вызова на самом деле избежать ошибки. Что-то Куинн ответил здесь. – dizy