правильный способ объявления строковых констант, которые зависят от #defines в цели c - PullRequest
0 голосов
/ 07 февраля 2011

Мне нужно объявить несколько URL, которые будут постоянными, но могут отличаться в зависимости от конфигурации здания.

Прямо сейчас у меня есть:

  • Файл .h, объявляющий такие вещи, как:

    extern NSString * const MY_URL;

  • Соответствующий файл .m с:

    NSString * const MY_URL =@ "http://myhost/myfolder";

Я хотел бы иметь возможность изменять« myhost »в зависимости от флагов здания. Я пытался создать определение, например:

#ifdef MYFLAG
#   define HOST @"http://myhost"
#else
#   define HOST @"http://myotherhost"
#endif

, а затем создатьконстанты, добавив HOST с остальной строкой:

NSString * const MY_URL = [HOST stringByAppendingString:@"/myfolder"];

Но, по-видимому, "Элемент инициализатора не является константой" .

Итак, мои вопросы:

Является ли мой подход правильным? Если да, то можете ли вы показать мне правильный способ сделать это? Может быть, это не тот способ, которым следует делать такие вещи в цели c?

Большое спасибо за ваше время!

1 Ответ

3 голосов
/ 07 февраля 2011

Посмотрите на этот Ответ переполнения стека

Вы не можете инициализировать const с результатом другой переменной, даже если этот результат является const.

Один из способов сделать то, что вы хотите, это обернуть определения во флаги:

#ifdef MYFLAG
#   NSString * const MY_URL = @"http://myhost/myfolder";
#else
#   NSString * const MY_URL = @"http://myotherhost/myfolder";
#endif

Редактировать - Сумасшедшая идея!

Хорошо, так что вы не хотитечтобы вручную настроить кучу URL-адресов.Вот сумасшедшая идея: как насчет того, чтобы создать класс, предоставляющий нужные вам URL?Таким образом, вы можете установить их в одном месте, и у вас есть преимущество, заключающееся в том, что вам нужно только перевести их в URL в одном месте.Например,

//HostURLs.h
#import <Cocoa/Cocoa.h>

@interface HostURLs : NSObject {
@private
    NSString *baseURLString;
    NSString *myURLString1;
    NSString *myURLString2;
}
@property (nonatomic, readonly) NSURL *myURL1;
@property (nonatomic, readonly) NSURL *myURL2;

@end

Тогда вы можете объявить класс

//HostURLs.m

#import "hostURLs.h"

@implementation HostURLs

- (id)init  {
    // You might want to set this up as as Singleton.   
    if (!(self = [super init])) {
        return nil; // Bail!
    }
    #ifdef MYFLAG
        baseURLString = @"http://myhost/";
    #else
        baseURLString = @"http://myotherhost/";
    #endif

    myURLString1 = @"myURL1";
    myURLString2 = @"myURL2";

    return self;
}

- (NSURL *)myURL1 {
    NSString *urlString = [baseURLString stringByAppendingString:myURLString1];
    return [NSURL urlWithString:urlString];
}

- (NSURL *)myURL2 {
    NSString *urlString = [baseURLString stringByAppendingString:myURLString2];
    return [NSURL urlWithString:urlString];
}

@end

Да, это безумие.Но таким образом, вы можете контролировать все ваши URL-адреса в одном месте.

...