【问题标题】:Defining a block in a switch statement results in a compiler error在 switch 语句中定义块会导致编译器错误
【发布时间】:2016-02-06 15:26:47
【问题描述】:

考虑以下 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:

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    为每个案例标签添加范围分隔符可以解决该错误。我认为这是因为块的范围现在明确地是 case 范围的子级。

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

    有一个类似问题的bug open with LLVM

    【讨论】:

    • 奇怪...我在挠头。顺便说一句,仅在显示错误的情况之前添加这些括号也可以解决问题。
    • 有趣,感谢您的评论。在我的测试中错过了这一点,因为我在整个过程中都使用了大括号以保持一致性
    • 即使是一个case中的数组元素访问也会触发这个bug。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多