Основываясь на превосходных ответах @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
наконец, в вашем файле .m, который связан с вашим файлом "@interface .h", поместите эти 3 строки:
#define define_key(x) NSString * const x = @#x;
#include "playFromConsts.h"
#undef define_key
обратите внимание на "#include", а не на "#import" - мы действительно хотим включить этот файл более одного раза.
это сделает всю грязную работу и обеспечит ключами NSString * const.
трейлинг; не является обязательным, так как он включен в макрос, однако я лично предпочитаю его.