2011-04-13 24 views
29

我是Objective-C的新手。本質上,我想將一組Endpoint URL作爲字符串存儲在我的應用程序中,但是我需要根據應用程序是否處於DEBUG模式而需要一個不同的域。我想這可能是使用頭文件(Common.h例如)用一些簡單的定義,像這樣有用:很明顯,因爲你不能立足恆定在另一個常量的值,這並不工作如何爲全局使用#define NSString?

#ifdef DEBUG 
    #define kAPIEndpointHost @"http://example.dev" 
#else 
    #define kAPIEndpointHost @"http://www.example.com" 
#endif 

#define kAPIEndpointLatest   [kAPIEndpointHost stringByAppendingString:@"/api/latest_content"] 
#define kAPIEndpointMostPopular  [kAPIEndpointHost stringByAppendingString:@"/api/most_popular"] 

顯然。

什麼是「正確」的方式來做到這一點?使用返回正確端點值的類方法擁有合適的類會更有意義嗎?

編輯:只要是明確的,「最新」和「MostPopular」字符串的主機字符串是基於是我遇到的最麻煩的東西。編譯器不喜歡#defines的stringByAppendingString部分。

+0

我看不出有什麼不對的,TBPH。 – 2011-04-13 01:47:49

+0

編譯器抱怨'stringByAppendingString'部分。我猜你不能#根據另一個常量定義一個常量。 – markquezada 2011-04-13 01:50:22

+2

什麼是實際的編譯器錯誤信息?我剛剛使用了上面的代碼片段,它編譯/運行得很好。 – 2011-04-13 02:13:09

回答

63

如果你只是連接字符串,您可以使用編譯時字符串連接:

#ifdef DEBUG 
    #define kAPIEndpointHost @"http://example.dev" 
#else 
    #define kAPIEndpointHost @"http://www.example.com" 
#endif 

#define kAPIEndpointLatest   (kAPIEndpointHost @"/api/latest_content") 
#define kAPIEndpointMostPopular  (kAPIEndpointHost @"/api/most_popular") 
+0

我想這真的是我問的。謝謝! – markquezada 2011-04-13 02:10:16

+0

現在如果我想使用變量而不是硬編碼的URL呢?例如。 #define kAPIEndpointHost VariableName其中VariableName在前一視圖中初始化。 – 2013-07-06 11:13:48

+0

@JayprakashDubey首先,我會避免在宏中使用外部變量。你將不得不使用NSString方法,因爲像這樣的連接只能在編譯時使用。我會'#define kAPILatestPath @「/ api/latest_content」'並將它拼湊在一起在函數中使用'NSString * APIEndpointLatest = [variableName stringByAppendingString:APILatestPath];' – cobbal 2013-07-06 19:30:32

11

在你的頭文件:

extern NSString *const kAPIEndpointHost; 
extern NSString *const kAPIEndpointLatestPath; 
extern NSString *const kAPIEndpointMostPopularPath; 

在您的實現文件:

#ifdef DEBUG 
    NSString *const kAPIEndpointHost = @"http://example.dev"; 
#else 
    NSString *const kAPIEndpointHost = @"http://www.example.com"; 
#endif 

NSString *const kAPIEndpointLatestPath = @"/api/latest_content"; 
NSString *const kAPIEndpointMostPopularPath = @"/api/most_popular"; 
+0

感謝您的回答。我仍然不確定如何根據主機值定義Latest和MostPopular常量。 – markquezada 2011-04-13 01:46:26

+0

@mirthlab,我只是在創建'NSURL'對象時將它們合併到代碼中。 – 2011-04-13 02:09:48

+0

+1似乎這是爲外部使用定義字符串常量更正確的方法,我想我真的更關心如何在編譯時連接字符串。我很欣賞這種迴應! – markquezada 2011-04-13 02:13:27

19

我不喜歡使用#defines作爲字符串常量。如果你想要全局常量和編譯時間連接。我會用以下內容:

頭文件

extern NSString *const kAPIEndpointHost; 
extern NSString *const kAPIEndpointLatestPath; 
extern NSString *const kAPIEndpointMostPopularPath; 

實現文件:

#ifdef DEBUG 
#define API_ENDPOINT_HOST @"http://example.dev" 
#else 
#define API_ENDPOINT_HOST @"http://www.example.com" 
#endif 

NSString *const kAPIEndpointHost = API_ENDPOINT_HOST; 
NSString *const kAPIEndpointLatestPath = (API_ENDPOINT_HOST @"/api/latest_content"); 
NSString *const kAPIEndpointMostPopularPath = (API_ENDPOINT_HOST @"/api/most_popular"); 
+0

感謝您的替代方法。小心解釋爲什麼這比使用#define定義字符串更可取? – markquezada 2012-03-07 02:47:03

+5

定義只是一個宏,所以每次出現宏時,都會創建一個新的字符串。常量NSString只創建一個字符串引用。我還發現跨文件更容易處理常量,而在鍵的情況下,常量的實際值可以隱藏在實現文件中,因爲它的實際值對實現而言並不重要。 – Eric 2012-03-07 19:15:26

+0

太棒了,謝謝。 +1教學:) – markquezada 2012-03-08 22:07:31