Как # определить строку NSString для глобального использования? - PullRequest
30 голосов
/ 13 апреля 2011

Я новичок в Objective-C.По сути, я хочу сохранить набор URL-адресов конечных точек в виде строк для использования в моем приложении, но мне нужен другой домен в зависимости от того, находится ли приложение в режиме отладки или нет.Я подумал, что было бы полезно использовать файл заголовка (например, Common.h) с некоторыми простыми определениями, такими как:

#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"]

Очевидно, что это не работает, так как вы не можете основывать константу наочевидно, значение другой константы.

Каков «правильный» способ сделать это?Будет ли разумнее иметь правильный класс с методами класса, которые возвращают правильные значения конечной точки?

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, строки "Latest" и "MostPopular" основаны на строке хоста - вот с чем у меня больше всего проблем.Компилятору не нравится часть stringByAppendingString определения #.

Ответы [ 3 ]

64 голосов
/ 13 апреля 2011

Если вы просто объединяете строки, вы можете использовать объединение строк времени компиляции:

#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")
19 голосов
/ 06 марта 2012

Мне не нравится использовать #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");
11 голосов
/ 13 апреля 2011

В вашем заголовочном файле:

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...