为什么我不能在 switch 语句中使用 NSInteger?

发布于 2024-10-10 16:53:19 字数 524 浏览 3 评论 0原文

为什么这不起作用:

NSInteger sectionLocation = 0;
NSInteger sectionTitles = 1;
NSInteger sectionNotifications = 2;

switch (section) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}

我收到此编译错误:

错误:大小写标签未简化为整数常量

不可能像这样使用 NSInteger 吗?如果是这样,是否有另一种方法可以在 switch 语句中使用变量作为 case ? sectionLocation 等具有变量值。

Why doesn't this work:

NSInteger sectionLocation = 0;
NSInteger sectionTitles = 1;
NSInteger sectionNotifications = 2;

switch (section) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}

I get this compile error:

error: case label does not reduce to an integer constant

Is it not possible to use NSInteger's like this? If so, is there another way to use variables as cases in a switch statement? sectionLocation etc. have variable values.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

南烟 2024-10-17 16:53:19

问题不在于标量类型,而在于当它们是这样的变量时,案例标签可能会改变值。

出于所有意图和目的,编译器将 switch 语句编译为一组 goto。标签不能是可变的。

使用枚举类型或#defines。

The problem isn't the scalar type, but that the case labels may change value when they are variables like that.

For all intents and purposes, the compiler compiles a switch statement as a set of gotos. The labels can't be variable.

Use an enumerated type or #defines.

初心 2024-10-17 16:53:19

原因是编译器通常希望使用开关值作为该表的键来创建一个“跳转表”,并且只有在切换简单的整数值时才能做到这一点。这应该有效:

#define sectionLocation  0
#define sectionTitles  1
#define sectionNotifications 2

int intSection = section;

switch (intSection) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}

The reason is that the compiler will often want to create a 'jump table' using the switch value as the key into that table and it can only do that if it's switching on a simple integer value. This should work instead:

#define sectionLocation  0
#define sectionTitles  1
#define sectionNotifications 2

int intSection = section;

switch (intSection) {
    case sectionLocation:
        //
        break;
    case sectionTitles:
        //
        break;
    case sectionNotifications:
        // 
        break;
    default:
        //
}
朦胧时间 2024-10-17 16:53:19

这里的问题是你正在使用变量。只能在 switch 语句中使用常量。

执行类似

#define SOME_VALUE 1

or 的

enum Values {
    valuea = 1,
    valueb = 2,
    ...
}

操作,您将能够在 switch 语句中使用 valuea 等。

The problem here is you are using variables. You can only use constants in switch statements.

Do something like

#define SOME_VALUE 1

or

enum Values {
    valuea = 1,
    valueb = 2,
    ...
}

And you will be able to use valuea and so forth in your switch statement.

墨落成白 2024-10-17 16:53:19

如果你的 case 值在运行时确实发生了变化,那就是 if...else if...else if 构造的用途。

If your case values truly change at runtime, that's what the if...else if...else if construct is there for.

忆离笙 2024-10-17 16:53:19

或者只是这样做

switch((int)secion)

or just do this

switch((int)secion)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文