@Barry Warkと@Matt Gallagherの優れた回答、および私の最初の回答(この回答の最後を参照)に基づいて構築する3番目のアプローチがあります。それは、変数名を1回だけ入力することを保証するマクロ/インクルードの組み合わせを使用することです。したがって、.h ファイルと .m ファイルの両方に同時に含まれます。
<編集>
「常に別の方法があります...」
追加のヘッダー ファイルを使用せずに、さらに単純にする方法を考えた後、ネストされたマクロを使用したより簡潔なアプローチを次に示します。
.h ファイル内
#define defineKeysIn_h_File(key) extern NSString * const key;
#define defineKeysIn_m_File(key) NSString * const key = @#key;
#define myKeyDefineKeys(defineKey) \
/**start of key list*/\
defineKey(myKeyABC);\
defineKey(myKeyXYZ);\
defineKey(myKey123);\
/*end of key list*/
myKeyDefineKeys(defineKeysIn_h_File);
.m ファイルで
myKeyDefineKeys(defineKeysIn_m_File);
実装メモ
これは複数のヘッダーで複数回使用できますが、「myKeyDefineKeys」の名前を一意になるように変更する必要があります。定義しているキーと同じプレフィックスを付けることをお勧めします - 私が使用した例のために」 myKey」全体。
別のファイルでは、「myOtherKeyDefineKeys」を使用する場合があります。
また、defineKeysIn_h_File マクロと defineKeysIn_m_File マクロをいじらないでください。定義が変更されたという警告が表示されます。
<編集終了>
元の回答、まだ有効ですが、洗練されていません
まず、vanilla.h ファイルを作成し、デフォルトの #ifdef などを削除して、以下のようにキーを入力します: (これは、AVAudioPlayer を拡張するために私が書いたカテゴリからカット アンド ペーストしたものです)
// playFromConsts.h
define_key(AVAudioPlayer_key_player);
define_key(AVAudioPlayer_key_duration);
define_key(AVAudioPlayer_key_filename);
define_key(AVAudioPlayer_key_filepath);
define_key(AVAudioPlayer_key_fileurl);
define_key(AVAudioPlayer_key_urlString);
define_key(AVAudioPlayer_key_envelope);
define_key(AVAudioPlayer_key_startDate);
define_key(AVAudioPlayer_key_linkToPlayer);
define_key(AVAudioPlayer_key_linkFromPlayer);
define_key(AVAudioPlayer_key_linkToPlayerEnvelope);
define_key(AVAudioPlayer_key_linkFromPlayerEnvelope);
define_key(AVAudioPlayer_key_deviceStartTime);
define_key(AVAudioPlayer_key_currentVolume);
define_key(AVAudioPlayer_key_fadeFromVolume);
define_key(AVAudioPlayer_key_fadeToVolume);
define_key(AVAudioPlayer_key_fadeTime);
define_key(AVAudioPlayer_key_segueTime);
次に、normal.h ファイル (@interface、@protocol などが宣言されている場所) に、これらの 3 行を配置します (もちろん、ヘッダー ファイルを置き換えます)。
#define define_key(x) extern NSString * const x;
#include "playFromConsts.h"
#undef define_key
最後に、「@interface .h」ファイルと対になっている .m ファイルに、次の 3 行を配置します。
#define define_key(x) NSString * const x = @#x;
#include "playFromConsts.h"
#undef define_key
「#import」ではなく「#include」に注意してください。実際には、このファイルを複数回インクルードしたいのです。
これはすべての面倒な作業を行い、キーが NSString * const であることを保証します。
末尾; マクロに含まれているため、オプションですが、個人的には好みです。