2012-04-07 17 views
5

Acabo de leer todas las variables constantes globales objetivas c Q & A pero las encontré inapropiadas para mi problema.Genere una lista de variables constantes a partir de otras constantes

necesito una lista de variables como esto:

NSString *baseURL = @"http://example.org"; 
NSString *mediaURL = @"http://example.org/media/"; 
NSString *loginURL = @"http://example.org/login/"; 
NSString *postURL = @"http://example.org/post/"; 
etc. 

Por supuesto que no se puede utilizar este código porque es un muy mal enfoque y si tengo que cambiar la URL base que hay que cambiar todas las variables. ya que necesito estas variables para acceder desde todas las clases de la aplicación que los declaró como global con este enfoque:

// Constants.h 
extern NSString *const baseURL; 
extern NSString *const mediaURL; 
extern NSString *const loginURL; 
extern NSString *const postURL; 


// Constants.m 
NSString *const baseURL = @"http://example.org"; 
NSString *const mediaURL = [NSString stringWithFormat:"%@%@", baseURL, @"/media/"]; 
NSString *const loginURL = [NSString stringWithFormat:"%@%@", baseURL, @"/login/"]; 
NSString *const postURL = [NSString stringWithFormat:"%@%@", baseURL, @"/post/"]; 

PERO no puedo hacer esto porque obtener este error:

Initializer element is not a compile-time constant 

Esto ocurre porque los objetos funcionan en tiempo de ejecución.

Ahora mi pregunta es, de una vez por todas, espero, ¿cuál es una buena y buena manera de manejar este escenario bastante habitual en las aplicaciones de red?

Creo que usar una clase (o una clase singleton) para manejar las variables constantes es un poco exagerado, y también es demasiado detallado usar algo como [MyClass globalVar] cada vez que lo necesito.

Ideas sobre esto?

Respuesta

4

Sé que está pasado de moda, pero yo solo usaría las macros del preprocesador y permitiría la concatenación de cadenas constante manejarlo.

#define baseURL @"http://example.org" 
#define mediaURL [email protected]"/media/" 
+0

Uhm, no está mal señor. Entonces, en este caso, solo necesito un archivo .h, ¿verdad? –

+0

@FredCollins sí .. –

+0

Sí. Las definiciones son solo reemplazos literales precompilados. (Sin embargo, para ser semiestático, uno podría cambiarle el nombre como FC_BASE_URL y FC_MEDIA_URL o algo por el estilo.) –

0

no tengo acceso a un Mac ahora ... ¿puedes probar este ..

en .h

NSString *baseURLString; 
extern NSString *const baseURL; 

en .m

baseURLString= @"http://example.org"; 
NSString *const baseURL= [NSString stringWithFormat:"%@", baseURL]; 

No estoy seguro de que esto funcione ...

Y También has visto esta respuesta al SO ... tiene todos los enfoques que conozco ... Constants in Objective-C

+0

No, no funciona por la misma razón que he citado en la pregunta. Gracias de cualquier manera. –

2
#define API_ROOT_URL @"https://www.example.org/api" 
NSString *const OAuthUrl = API_ROOT_URL @"/oauthToken"; 

See also.