在switch语句中定义块会导致编译器错误

aed*_*ols 26 objective-c

请考虑以下switch语句:

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

它会导致编译器错误

Cannot jump from switch statement to this case label

就行了case 1:.

为什么会发生这种情况,我该如何解决?

aed*_*ols 69

块定义创建了一个新的作用域,它似乎会干扰编译器正确解释switch语句的能力.

为每个案例标签添加范围分隔符可解决错误.我认为这是因为块的范围现在毫无疑问是案例范围的子项.

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

对于类似的问题,LLVM有一个错误.

  • 奇怪......我正在挠头.BTW仅在显示错误的情况之前添加这些括号也解决了问题. (4认同)