2012-04-07 73 views
5

我剛剛閱讀了全部objective-c全局常量變量 Q & A但我發現它們對我的問題不合適。從其他常量構建一個常量變量列表

我需要這樣的變量列表:

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

當然是因爲它是一個非常不錯的辦法,我不能使用此代碼,如果我需要改變基本URL我必須改變所有變量。 因爲我需要從每一類應用的,我宣佈他們作爲全球使用這種方法訪問這些變量:

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

,因爲我,我不能這樣做得到這個錯誤:

Initializer element is not a compile-time constant 

發生這種情況是因爲對象在運行時工作。

現在我的問題是,一勞永逸,我希望,在網絡應用程序中處理這種非常平常的情況的好方法是什麼?我認爲使用一個類(或單一類)來處理常量變量有點矯枉過正,而且它也過於冗長,每次我需要它時都會使用類似[MyClass globalVar]的東西。

想法呢?

回答

4

我知道這是老式的,但我只是使用預處理器宏,並讓常量字符串連接來處理它。

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

嗯,還不錯先生。所以在這種情況下,我只需要一個.h文件,對吧? – 2012-04-07 14:49:51

+0

@FredCollins是.. – 2012-04-07 14:50:32

+0

是的。這些定義只是預編譯字面替換。 (雖然,要達到半標準,可以將它們重命名爲FC_BASE_URL和FC_MEDIA_URL或其他類型。) – 2012-04-07 14:52:45

0

我沒有訪問MAC現在...你只是嘗試這個..在.H

NSString *baseURLString; 
extern NSString *const baseURL; 

在.M

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

我不確定這會行嗎..

還有還你見過這樣這個答案......它擁有所有我知道的方法... Constants in Objective-C

+0

不,它不符合我在問題中引用的相同原因。不管怎麼說,還是要謝謝你。 – 2012-04-07 15:39:18

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

See also.