建立在@Barry Wark 和@Matt Gallagher 的优秀答案的基础上,我的初步回应(见本答案的结尾)还有第三种方法,那就是使用宏/包含组合,确保您只键入一次变量名,并且因此它同时包含在 .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
注意“#include”而不是“#import”——我们实际上确实想多次包含这个文件。
这将完成所有肮脏的工作,并确保键是 NSString * const。
尾随; 是可选的,因为它包含在宏中,但我个人更喜欢它。