¿Por qué no puedo usar un NSInteger en una declaración de cambio?

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

Obtengo este error de compilación:

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.

preguntado el 08 de enero de 11 a las 19:01

5 Respuestas

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.

Respondido el 08 de enero de 11 a las 22:01

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

Respondido el 08 de enero de 11 a las 22:01

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

Haz algo como

#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.

Respondido el 08 de enero de 11 a las 22:01

So I'll have to resort to if-else-if-else again? Isn't there a way around this? - Cremallera

Yes, use defines, whats the problem with that? :D - fresskoma

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

Respondido el 08 de enero de 11 a las 22:01

or just do this

switch((int)secion)

Respondido el 09 de enero de 11 a las 03:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.