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

时间:2011-01-08 19:10:14

标签: iphone objective-c cocoa-touch switch-statement nsinteger

为什么这不起作用:

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

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

我收到了这个编译错误:

  

错误:case标签不会减少为整数常量

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

5 个答案:

答案 0 :(得分:11)

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

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

使用枚举类型或#defines。

答案 1 :(得分:4)

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

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

int intSection = section;

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

答案 2 :(得分:2)

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

执行类似

的操作
#define SOME_VALUE 1

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

您可以在switch语句中使用valuea等。

答案 3 :(得分:1)

如果您的案例值在运行时真正发生了变化,那就是if ... else if ... else if construct for。

答案 4 :(得分:-2)

或只是这样做

switch((int)secion)