开发者

Why can't I use an NSInteger in a switch statement?

Why doesn't th开发者_JAVA百科is 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.


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.


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:
        //
}


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.


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


or just do this

switch((int)secion)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜