5

Objective-C グローバル定数変数Q&Aをすべて読んだところですが、私の問題には不適切であることがわかりました。

次のような変数のリストが必要です。

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

もちろん、このコードは非常に悪いアプローチなので使用できません。ベース URL を変更する必要がある場合は、すべての変数を変更する必要があります。アプリのすべてのクラスからこれらの変数にアクセスする必要があるため、このアプローチでそれらをグローバルとして宣言しました。

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

3 に答える 3

4

時代遅れであることはわかっていますが、プリプロセッサ マクロを使用して、定数文字列の連結で処理できるようにします。

#define baseURL @"http://example.org"
#define mediaURL baseURL@"/media/"
于 2012-04-07T14:23:45.967 に答える
2
#define API_ROOT_URL @"https://www.example.org/api"
NSString *const OAuthUrl = API_ROOT_URL @"/oauthToken";

も参照してください。

于 2013-08-18T14:12:44.787 に答える
0

今は MAC にアクセスできません...これを試していただけますか..

.h で

NSString *baseURLString;
extern NSString *const baseURL;

メートルで

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

これが機能するかどうかはわかりません..

また、SOでこの回答を見たことがありますか...私が知っているすべてのアプローチがあります... Objective-Cの定数

于 2012-04-07T14:50:06.337 に答える