Подтвердить что ты не робот

Определение блока в выражении switch приводит к ошибке компилятора

Рассмотрим следующий оператор switch:

switch (buttonIndex) {
    case 0:
        [self fooWithCompletion:^{
            [weakSelf finishEditing];
        }];
        break;
    case 1: // Error here
        [self barWithCompletion:^{
            [weakSelf finishEditing];
        }];
        break;    
    default:
        break;
}

Он вызывает ошибку компилятора

Cannot jump from switch statement to this case label

в строке case 1:.

Почему это происходит и как его исправить?

4b9b3361

Ответ 1

Определение блока создает новую область видимости, которая, как представляется, мешает компилятору правильно интерпретировать оператор switch.

Добавление разделителей областей для каждого ярлыка case устраняет ошибку. Я думаю, это связано с тем, что область блока теперь однозначно является дочерним объектом области действия.

switch (buttonIndex) {
    case 0:
    {
        [self updateUserDataWithCompletion:^{
            [weakSelf finishEditing];
        }];
        break;
    }
    case 1:
    {
        [self updateOtherDataWithCompletion:^{
            [weakSelf finishEditing];
        }];
        break;
    }
    default:
        break;
}

В этом случае проблема с отключена с LLVM.