2011-01-08 10 views
7

¿Por qué no funciona:¿Por qué no puedo usar un NSInteger en una instrucción switch?

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

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

me sale este error de compilación:

error: case label does not reduce to an integer constant

No es posible el uso de NSInteger de esta manera? Si es así, ¿hay alguna otra manera de usar variables como casos en una instrucción switch? sectionLocation etc. tienen valores variables.

Respuesta

10

El problema no es el tipo escalar, sino que las etiquetas de mayúsculas y minúsculas pueden cambiar de valor cuando son variables como esa.

Para todos los efectos, el compilador compila una declaración de interruptor como un conjunto de gotos. Las etiquetas no pueden ser variables.

Use un tipo enumerado o #defines.

2

El problema aquí es que está utilizando variables. Solo puede usar constantes en instrucciones de cambio.

hacer algo como

#define SOME_VALUE 1 

o

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

Y usted será capaz de utilizar valorA y así sucesivamente en su sentencia switch.

+0

Así que voy a tener que recurrir a if-else-if-else nuevo? ¿No hay una forma de evitar esto? – Rits

+0

Sí, el uso define, ¿cuál es el problema con eso? :RE – fresskoma

4

La razón es que el compilador a menudo querrá crear una 'tabla de salto' utilizando el valor del interruptor como la clave en esa tabla y solo puede hacerlo si está activando un valor entero simple. Esto debería funcionar en su lugar:

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

int intSection = section; 

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

Si sus valores de casos verdaderamente cambian en tiempo de ejecución, que es lo que el if ... else if ... else if constructo está ahí para.

-2

o simplemente hacer esto

switch((int)secion) 
Cuestiones relacionadas