2012-04-07 17 views
5

Ho appena letto tutte le variabili di costanti globali dell'obiettivo -c Q & A ma le ho trovate inadatte al mio problema.Costruisci un elenco di costanti variabili da altre costanti

ho bisogno di un elenco di variabili come questo:

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

Naturalmente non posso usare questo codice, perché è un approccio molto male e se ho bisogno di cambiare l'URL di base devo cambiare tutte le variabili. Da quando ho bisogno di queste variabili a cui accedere da ogni classe delle app li ho dichiarato come globale con questo approccio:

// 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/"]; 

MA non posso farlo perché ho ottenere questo errore:

Initializer element is not a compile-time constant 

Ciò accade perché gli oggetti funzionano in fase di esecuzione.

Ora la mia domanda è, una volta e per tutte, spero, qual è un buon modo per gestire questo scenario piuttosto comune nelle app di rete?

Penso che usare una classe (o una classe singleton) per gestire le variabili delle costanti sia un po 'eccessivo, ed è anche troppo prolisso usare qualcosa come [MyClass globalVar] ogni volta che ne ho bisogno.

Idee a riguardo?

risposta

4

So che è obsoleto, ma userei solo le macro del preprocessore e consento che la concatenazione costante delle stringhe lo gestisca.

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

Uhm, non male signore. Quindi in questo caso ho bisogno di un solo file .h, giusto? –

+0

@FredCollins sì .. –

+0

Sì. Le definizioni sono solo sostituzioni letterali precompilate. (Anche se, per essere semi-standard, si potrebbero rinominarli come FC_BASE_URL e FC_MEDIA_URL o qualcosa del genere.) –

0

Non ho accesso a un Mac ora ... si può solo provare questo ..

in .h

NSString *baseURLString; 
extern NSString *const baseURL; 

a .m

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

Non sono sicuro che funzionerà ..

E anche hai visto questa risposta a SO ... ha tutti gli approcci che conosco ... Constants in Objective-C

+0

No, non funziona per la stessa ragione per cui ho citato nella domanda. Grazie comunque. –

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

See also.