Переход к делу. Я воссоздал свою проблему, поскольку она не требует пояснений.
это соответствует без ошибок:
switch (n) {
case 1:
NSLog(@"");
NSString *aStr;
break;
default:
break;
}
это компилируется с ошибкой, и в нем отсутствует только NSLog ():
switch (n) {
case 1:
NSString *aStr;
break;
default:
break;
}
выдает ошибку при компиляции " Ожидаемое выражение перед 'NSString' "
Я что-то упустил?
Ответы:
В обычном C вам придется заключить это в скобки в обоих случаях. Я подозреваю, что это может решить вашу проблему:
case 1: { NSLog(@""); NSString *aStr; break; }
См. Этот вопрос SO для получения дополнительной информации.
Другой способ обойти эту проблему - поместить оператор между меткой case и первым объявлением, как вы это сделали в своем рабочем примере выше. См. Комментарии и ответ Куинна Тейлора для получения дополнительной информации.
источник
;
) послеcase
метки тоже работает. Причина ошибки и причина того, почему оба решения работают, заключается в том, что метка, включаяcase
метку, может только предшествовать оператору. Объявления не являются операторами в C (C99 §6.7, §6.8, §6.8.2) и Objective-C, поэтому вы не можете поставить метку непосредственно перед объявлением. Таким образом, решения: либо поместите оператор (например,;
илиNSLog(@"");
) между меткой и объявлением, либо заключите объявление в составной оператор (скобки) после метки.Вы не можете объявить переменную в качестве первого оператора в
case
без скобок и во многих других контекстах на языках на основе C. Подробнее см. Объявление переменных внутри оператора switch .источник
case 0: { Loading my nib file; break; } case 1: { Loading another nib file; break; } Note that if you don't have an assignment (x = y) right after the case it won't be a problem. For example:
источник