11

重複の可能性:
Objective C の定数

一部のアプリ設定を NSUserDefaults に保存します。NSStrings はキーとして使用されます。問題は、これらの NSString キーを使用してアプリ全体でこれらの設定にアクセスする必要があることです。アプリの一部にアクセスするときに、そのような文字列キーをタイプミスする可能性があります。

アプリ全体で、私はそのような声明を持っています

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

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

アプリ全体でアクセスできるグローバル NSString 定数を宣言する方法と場所を教えてください。これで、これらの文字列キーの入力ミスを心配することなく、その定数を使用できるようになります。

4

4 に答える 4

13

まず、マクロではなく、実際の extern C シンボルを使用する必要があります。これは次のように行われます。

SomeFile.h

extern NSString *const MONConstantString;

SomeFile.m

NSString *const MONConstantString = @"MONConstantString";

ObjC と ObjC++ を組み合わせて使用​​する場合は、C++ TU を指定する必要があることに注意してください。これが、言語によって異なる d エクスポートextern "C"が表示される理由です。#define


次に、関連するインターフェイスの近くに定数を配置します。あなたの例をリードとして取り上げると、アプリの設定用に一連のインターフェイスまたは宣言が必要になる場合があります。その場合、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];
于 2012-08-13T11:55:41.967 に答える
9

あなたの考えは正しいと思います。たとえば、次のような Const.h/m ファイルを作成しました。

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 のみをインポートする必要があります。

コードを記述する場合、Xcode はキー名の記述をサポートしているため、入力ミスを避けることができます。

于 2012-08-13T11:09:35.367 に答える
5

あなたが探しているように見えるのは、アプリで文字列定数を定義する方法です。

以下に引用したこの質問 とそれに対するこの回答を参照してください。

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

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

このファイルは、定数を使用する各ファイルまたはプロジェクトのプリコンパイル済みヘッダーに含めることができます。

これらの定数は、次のように .m ファイルで定義します。

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

最終製品にリンクされるように、Constants.m をアプリケーション/フレームワークのターゲットに追加する必要があります。

#define された定数の代わりに文字列定数を使用する利点は、 (stringInstance == MyFirstConstant)文字列比較よりもはるかに高速な([stringInstance isEqualToString:MyFirstConstant])(そして読みやすい、IMO) ポインター比較を使用して等価性をテストできることです。

Barry Wark に感謝します :)

于 2012-08-13T11:01:54.250 に答える
4

これを行う最も簡単な方法は、Utils.h のような単純な .h ファイルを作成し、そこに次のコードを記述することです。

#define kUserDefaults @"ReminderSwitch"

于 2012-08-13T11:14:53.733 に答える