#objective-c #c #switch-statement
#цель-c #c #оператор переключения #objective-c
Вопрос:
У меня есть этот фрагмент кода в одном из моих файлов:
switch ([sender tag]){
...
case 100:
UIView *v1 = [UIView alloc] initWithFrame blabllabla...
[v1 bla bla bla...
break;
...
Выглядит довольно стандартно, да? Но это выдает мне эту ошибку:
"Use of undeclared v1"
Затем я ввожу оператор «NSLog ()» или «if», например, так:
case 100:
NSLog(@"why need a nslog here?");
или
case 100:
if(1==1) {
...
Тогда это работает.
Кто-нибудь знает, почему это? Это мой код или правила objective-c?
Комментарии:
1. Это не имеет ничего общего конкретно с Objective-C;
label: declaration
этого нет в стандартной грамматике C, от которой наследуется Objective-C.
Ответ №1:
Вы не можете объявлять переменные, область видимости которых ограничена case
без использования блока C. Измените ее на:
case 100:
{
UIView *v1 = [UIView alloc] initWithFrame blabllabla...
[v1 bla bla bla...
break;
}
и это должно сработать.
Комментарии:
1. ВАУ-ВАУ … это работает!! спасибо, чувак, я задавался этим вопросом в течение 1 часа, и я не мог понять, «почему», ЛОЛ. В любом случае, мне нужно подождать 4 минуты, чтобы выбрать лучший ответ. Лучший ответ был зарезервирован для u =)
2.
case 100:; UIView *v1...
тоже сработало бы. Посмотрите грамматику C, она находится в определении меток. Вы также не могли бы поместить метку goto перед объявлением.3. @tristopia Интересно. Я никогда не думал о
case
создании лейбла, но теперь, когда вы упомянули, это имеет смысл.