2012-04-07 13 views
5

Ich habe gerade alle objective-c globalen Konstanten Variablen Q & A gelesen, aber ich fand sie unpassend zu meinem Problem.Erstellen Sie eine Liste der Konstanten Variable von anderen Konstanten

Ich brauche eine Liste von Variablen wie folgt aus:

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

Natürlich kann ich nicht diesen Code verwenden, weil es ein sehr schlechter Ansatz ist, und wenn ich die Basis-URL ändern müssen muss ich alle Variablen ändern. Da ich brauche diese Variablen aus jeder Klasse der App zugegriffen werden ich sie mit diesem Ansatz als global deklariert:

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

ABER Ich kann das nicht tun, weil ich Erhalten Sie diesen Fehler:

Initializer element is not a compile-time constant 

Das passiert, weil Objekte zur Laufzeit funktioniert.

Jetzt ist meine Frage, ein für allemal hoffe ich, was ist eine nette und gute Möglichkeit, dieses ziemlich übliche Szenario in Netzwerk-Apps zu behandeln?

Ich denke, verwenden Sie eine Klasse (oder eine Singleton-Klasse) für die Handhabung der Konstanten Variablen ist ein bisschen übertrieben, und es ist auch zu ausführlich verwenden so etwas wie [MyClass globalVar] jedes Mal, wenn ich es brauche.

Ideen dazu?

Antwort

4

Ich weiß, es ist altmodisch, aber ich würde nur Präprozessor-Makros verwenden und konstante String-Verkettung damit umgehen lassen.

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

Uhm, nicht schlecht Sir. Also brauche ich in diesem Fall nur eine .h Datei, oder? –

+0

@FredCollins ja .. –

+0

Ja. Die Definitionen sind nur literale Ersetzungen vor der Kompilierung. (Um jedoch halbstandardisiert zu sein, könnte man sie als FC_BASE_URL und FC_MEDIA_URL oder etwas Ähnliches umbenennen.) –

0

Ich habe keinen Zugriff auf einen MAC jetzt ... Sie können nur versuchen, diese ..

in .h

NSString *baseURLString; 
extern NSString *const baseURL; 

in .m

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

Ich bin mir nicht sicher, ob das funktionieren wird.

Und auch haben Sie bei SO diese Antwort gesehen ... es hat alle Ansätze, die ich kenne ... Constants in Objective-C

+0

Nein, es funktioniert nicht aus dem gleichen Grund, den ich in der Frage zitiert habe. Danke trotzdem. –

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

See also.