8

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.

Abizern
  • 146,289
  • 39
  • 203
  • 257
Rits
  • 5,105
  • 4
  • 42
  • 53

5 Answers5

11

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.

bbum
  • 162,346
  • 23
  • 271
  • 359
4

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:
        //
}
trojanfoe
  • 120,358
  • 21
  • 212
  • 242
2

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.

fresskoma
  • 25,481
  • 10
  • 85
  • 128
1

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

Kendall Helmstetter Gelner
  • 74,769
  • 26
  • 128
  • 150
-2

or just do this

switch((int)secion)
anon
  • 9