Странная инструкция «Случай переключения»

#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 создании лейбла, но теперь, когда вы упомянули, это имеет смысл.