2010-05-26 8 views
6

En primer lugar, he visto this question y entiendo por qué el siguiente código no funciona. Esa no es mi pregunta.Constantes con otro nombre

Tengo una constante, que se declara como;

//Constants.h 
extern NSString * const MyConstant; 

//Constants.m 
NSString * const MyConstant = @"MyConstant"; 

Sin embargo, en ciertos contextos, es más útil tener esta constante tiene un nombre mucho más descriptivo, como MyReallySpecificConstant. Tenía la esperanza de hacer:

//SpecificConstants.h 
extern NSString * const MyReallySpecificConstant; 

//SpecificConstants.m 
#import "Constants.h" 
NSString * const MyReallySpecificConstant = MyConstant; 

Obviamente, no puedo hacer esto (que se explica en la pregunta vinculado anteriormente).

Mi pregunta es:

¿De qué otra (además de algo así como #define MyReallySpecificConstant MyConstant) que puede proporcionar una única constante bajo varios nombres?

Respuesta

6

En general, el compilador doblará las constantes de cadena idénticas en las mismas cadenas a menos que le diga que no lo haga. Aunque no puede inicializar una constante con otra, inicializar ambas con el mismo valor tendrá el mismo efecto neto.

//Constants.h 
extern NSString * const MyConstant; 
extern NSString * const MyOtherConstant; 

//Constants.m 
#define MyConstantValue "MyConstant" 
NSString * const MyConstant = @MyConstantValue; 
NSString * const MyOtherConstant = @MyConstantValue; 

oculta el # define en un archivo de origen en lugar de en un encabezado. Solo tienes que cambiar el valor en un solo lugar. Tienes dos nombres para una constante. Por supuesto, en su escenario con constantes definidas en múltiples archivos, debería tener la #define accesible para esos archivos fuente.

+0

+1 Me gusta esta opción, ya que me permite mantener mi modificador 'const', pero aún así solo tengo el valor real de la cadena en un solo lugar. –

4

Mi primera reacción a su pregunta fue una pregunta a cambio - ¿Es el hecho de que quiere tener una constante bajo varios nombres, un indicador de que el nombre de la constante necesita replantearse en primer lugar?

+0

+1 este es un muy buen punto, y uno que probablemente debería considerar. Sin embargo, en este punto necesito usar los mismos valores. –

2

Asignar las constantes de cadena de código:

//Constants.h 
extern NSString * MyConstant; 
extern NSString * MyOtherConstant; 
void setUpConstants(); 

//Constants.m 
NSString * MyConstant; 
NSString * MyOtherConstant; 
NSString * const ValueOfString = @"A Value"; 
void setUpConstants() 
{ 
    MyConstant = ValueOfString; 
    MyOtherConstant = ValueOfString; 
} 

Una desventaja si que no están protegidos por el compilador contra la modificación. Sin embargo, la inicialización es muy flexible y quizás puedas mejorar otro código. También garantiza diferentes direcciones para sus cadenas, independientemente de si el compilador decide que doblar es lo que hace esta semana.

+0

+1 Creo que si fuera por esta ruta, probablemente haría la inicialización en una función '__attribute__ ((constructor))' para que ocurra automáticamente cuando se cargue el código. –

Cuestiones relacionadas