2012-04-07 19 views
5

Po prostu przeczytałem wszystkie z .-c zmienne globalne stałe A ale znalazłem je nieodpowiednie dla mojego problemu.Zbuduj listę zmiennych stałych z innych stałych

muszę listę zmiennej takiego:

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

Oczywiście nie mogę użyć tego kodu, ponieważ jest to bardzo złe podejście i jeśli muszę zmienić podstawowy adres URL muszę zmienić wszystkie zmienne. Ponieważ muszę zmienne te mają być dostępne z każdej klasy aplikacji oświadczyłem je jako globalne z takim podejściem:

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

ALE Nie mogę tego zrobić, bo ten błąd:

Initializer element is not a compile-time constant 

Dzieje się tak, ponieważ obiekty działają w środowisku wykonawczym.

Moje pytanie brzmi: raz na zawsze mam nadzieję, jaki jest dobry i dobry sposób na radzenie sobie z tym dość typowym scenariuszem w aplikacjach sieciowych?

Myślę, że użycie klasy (lub klasy singleton) do obsługi zmiennych stałych jest nieco przesadzone, a także zbyt szczegółowe użycie czegoś takiego jak [MyClass globalVar] za każdym razem, gdy jest to potrzebne.

Pomysły na ten temat?

Odpowiedz

4

Wiem, że to staroświeckie, ale użyłbym makr preprocesora i pozwoliłbym na ciągłe łączenie ciągów.

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

Uhm, nie złe sir. Więc w tym przypadku potrzebuję tylko jednego pliku .h, prawda? –

+0

@FredCollins tak .. –

+0

Tak. Definicje są po prostu kompilacją dosłownego zamiennika. (Chociaż, aby być pół-standardem, można zmienić ich nazwę na FC_BASE_URL i FC_MEDIA_URL lub coś w tym rodzaju.) –

0

nie mam dostępu do komputera Mac teraz ... może po prostu spróbować tego ..

w .h

NSString *baseURLString; 
extern NSString *const baseURL; 

w .m

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

Nie jestem pewien, czy to zadziała.

również widziałeś tę odpowiedź na SO ... ma wszystkie podejścia znam ... Constants in Objective-C

+0

Nie, to nie działa z tego samego powodu, o którym wspomniałem w pytaniu. Dzięki i tak. –

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

See also.