2012-08-13 18 views
11
を使用する

可能性の重複:
Constants in Objective Cはどのように宣言し、NSStringのにグローバル定数

私はNSUserDefaultsでいくつかのアプリの設定を保存します。 NSStringはキーとして使用されます。問題は、これらのNSStringキーを使用してアプリ全体でこれらの設定にアクセスする必要があることです。アプリの一部でアクセスするときに、そのような文字列キーを誤って入力する可能性があります。アプリを通じて

は、私が

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ReminderSwitch"]; 

BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"]; 

どのように、どこで、このようなステートメントを持っている私は、アプリケーション全体でアクセスできるグローバルNSStringの定数を宣言することができます。私はそれらの文字列キーをミスタイプすることを心配することなくその定数を使用することができます。

答えて

5

あなたの探しているように見えるのは、アプリで文字列定数を定義する方法です。あなたが使用する各ファイルで、このファイルを含めることができますあなたは

// Constants.h 
FOUNDATION_EXPORT NSString *const MyFirstConstant; 
FOUNDATION_EXPORT NSString *const MySecondConstant; 
//etc. 

のようなヘッダファイルを作成する必要があります

は、私は下に引用してきたthis question とそれにthis answerを参照してください。定数、またはプロジェクトのプリコンパイル済みヘッダーに格納されます。

は、あなたはそれが最終製品にリンクされるように、アプリケーション/フレームワークのターゲットに追加する

// Constants.m 
NSString *const MyFirstConstant = @"FirstConstant"; 
NSString *const MySecondConstant = @"SecondConstant"; 

Constants.mよう.mファイルでこれらの定数を定義します。

代わりに#define'd定数 の文字列定数を使用する利点は、文字列 比較([stringInstance isEqualToString:MyFirstConstant])(および 読みやすく、IMO)よりもはるかに高速であるポインタの比較 (stringInstance == MyFirstConstant)を使用して等しいかどうかをテストすることができるということです。バリー覆うWark :)のおかげで

+0

彼アプリ内の定数を必要とするだけです(内部のliなぜあなたは彼にそれらをエクスポートすることを提案しているのだろうか(外部リンク)? – malhal

9

あなたの考えは、私が考える権利です。

Const.h

extern NSString *const UserIdPrefKey; 
extern NSString *const PasswordPrefKey; 
extern NSString *const HomepagePrefKey; 

がConst.m

#import "AEConst.h" 

NSString *const UserIdPrefKey = @"UserIdPrefKey"; 
NSString *const PasswordPrefKey = @"PasswordPrefKey"; 
NSString *const HomepagePrefKey = @"UrlHomepagePrefKey"; 

が唯一Const.hをインポートする必要があります。例えば、私は以下のようなConst.h/m個のファイルを作りました。

コードを書くとき、Xcodeはキー入力ミスを避けるためにキー名の書き込みをサポートしています。

5

これを行う最も簡単な方法は、Utilsのような単純な.hファイルを作ることです。時間は次のコードが書いて:

#define kUserDefaults @"ReminderSwitch"

+3

ええ、それほど安全ではない、他の目的のCファイルが気付かれることなくそれを上書きする機会があります:( – thndrkiss

13

まず、あなたは本当のexternのCのシンボルのために行く必要があります - ではないマクロ。これはそうのように行われます。

SomeFile.h

extern NSString *const MONConstantString; 

SomeFile.mあなたが++にObjCとにObjCのミックスを使用している場合、あなたはCのためextern "C"を指定する必要がありますことを

NSString *const MONConstantString = @"MONConstantString"; 

ノート++つまり、言語によって異なる#define dのエクスポートが表示されます。


次に、関係するインターフェイスの近くに定数を配置するとよいでしょう。あなたの例をリードとして考えてみると、あなたのアプリの設定に対するインターフェースや宣言のセットが必要な場合があります。その場合、あなたはMONAppsPreferencesヘッダに宣言を追加するかもしれません:使用中

MONAppsPreferences.h

extern NSString *const MONApps_Pref_ReminderSwitch; 

MONAppsPreferences.m

NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch"; 

#import "MONAppsPreferences.h" 
... 
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch]; 
関連する問題