2012-04-07 12 views
5

objective-cグローバル定数変数 Q & Aを読んだだけですが、私の問題には不適切だと分かりました。他の定数から変数の定数リストを作成する

私はこのような変数のリストが必要です。それは非常に悪いアプローチだと私はベースURLを変更する必要がある場合、私はすべての変数を変更しなければならないので、私はこのコードを使用することはできません。もちろん、

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

を。

// 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

私はそれが昔ながらのことを知っていますが、私はプリプロセッサマクロを使用して、定数の文字列連結を処理させています。

私は今、MACへのアクセスを持っていない
#define baseURL @"http://example.org" 
#define mediaURL [email protected]"/media/" 
+0

オム、悪くない先生を知っているすべてのアプローチがあります。ですから、この場合は1つの.hファイルしか必要ありません。 –

+0

@FredCollinsはい.. –

+0

はい。定義は、リテラルの置換をプレコンパイルするだけです。 (ただし、準標準であるため、名前をFC_BASE_URLやFC_MEDIA_URLなどの名前に変更することがあります) –

0

...あなたはこれを試すことができます。..・H

NSString *baseURLString; 
extern NSString *const baseURL; 
.Mで

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

私はこれがうまくいくかどうかわからない。

そしてまた、あなたはSOでこの答えを見てきました...それは私が... Constants in Objective-C

+0

いいえ、それは私が質問で引用したのと同じ理由で動作しません。とにかくありがとう。 –

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

See also.