tutorial objective example objective-c

objective c - objective - la constante entera no ''se reduce a un número entero''



objective c vs swift (5)

Uso este código para establecer mis constantes

// Constants.h extern NSInteger const KNameIndex; // Constants.m NSInteger const KNameIndex = 0;

Y en una instrucción switch dentro de un archivo que importa el archivo Constant.h tengo esto:

switch (self.sectionFromParentTable) { case KNameIndex: self.types = self.facilityTypes; break; ...

Recibo un error en la compilación que dice esto: "error: la etiqueta del caso no se reduce a una constante entera"

¿Alguna idea de lo que podría estar mal?


Esta es una puñalada en la oscuridad porque no he usado Cocoa / ObjC en mucho tiempo, pero ¿la sección variable miembro no es de tipo intFromParentTable?


No he trabajado con Objective C, pero trataría de arrojar el ''extern''. Al menos si fuera C ++, el archivo Constants.m no sería parte de la unidad de compilación de Other.m , por lo que el valor de KNameIndex sería desconocido para el compilador. Lo cual explicaría el error; un valor incognoscible no puede ser una constante.

¿Ayuda la definición, no solo la declaración, en el archivo Constants.h ?


Para C / C ++ y Objective-C, la sentencia case debe tener valores fijos - "reducido a un entero (valor de lectura) " en tiempo de compilación

Sus constantes no son una "constante" real porque es una variable y me imagino que se puede cambiar a través de un puntero, es decir, &KNameIndex

Usualmente uno define constantes como enum

enum { KNameIndex = 0, kAnotherConstant = 42 };

Si usa C ++ u Objective-C ++ (con .mm como extensión de archivo) puede usar una instrucción const como

const int KNameIndex = 0;


Puedes usar

#define KNameIndex 0 ... switch (self.sectionFromParentTable) { case KNameIndex: self.types = self.facilityTypes; break; ...

y debería funcionar

Solo tuve el mismo problema y decidí ir con #define en lugar de enum. Funciona para mí ™ ;-)


Creo que estás atascado con el uso de una const int lugar de const NSInteger ya que el conmutador solo funciona con tipos integrales incorporados. (no estoy seguro de su sintaxis con const volteado después del tipo).

Eche un vistazo a la pregunta relacionada: Objective-C switch using objects?