2011-02-07 3 views
0

定数であるが建物の構成によって異なるURLの束を宣言する必要があります。目的のcの#definesに依存する文字列定数を宣言する正しい方法

は、今私が持っているものです。

  • のようなものを宣言する.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で行うべきではないかもしれませんか?

ありがとうございました!

答えて

3

は、あなたはその結果がconstの場合でも、別の変数の結果とのconstを初期化することはできません。このStack Overflow answer

を見てください。あなたがやりたい

一つの方法は、フラグの定義をラップすることです:

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

編集 - クレイジーなアイデア!

大丈夫ですので、手作業でURLを設定する必要はありません。クレイジーなアイディアがあります:必要なURLを提供するクラスを作成するのはどうですか?そうすれば、あなたは1か所でそれらを設定することができ、1つの場所でそれらを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を1か所で制御できます。

+0

ありがとう、私はその答えを読んだ。私は20以上のURLでそれを行う必要があります。そのため、私はそのオプションが気に入らなかったのです。回答ありがとう:) – Gelu

+0

ねえ、 "クレイジーアイデア"は私にとってはるかに魅力的に見えます。私を助ける時間を投資してくれてありがとう! – Gelu

+0

この場合、upvoteは害を与えません。そして、あなたは答えを「受け入れる」ことができます。 – Abizern

関連する問題