Небольшое изменение предложения @Krizz, чтобы оно работало должным образом, если заголовочный файл констант должен быть включен в PCH, что довольно нормально. Так как оригинал импортируется в PCH, он не будет перезагружать его в файл .m
, и поэтому вы не получите никаких символов, а компоновщик недоволен.
Однако следующая модификация позволяет ему работать. Это немного запутанно, но это работает.
Вам понадобятся 3 файлы, .h
файл с постоянными определениями, файл .h
и файл .m
, я буду использовать ConstantList.h
, Constants.h
и Constants.m
соответственно. содержимое Constants.h
просто:
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
и файл Constants.m
выглядит следующим образом:
// Constants.m
#ifdef STR_CONST
#undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"
Наконец, файл ConstantList.h
содержит фактические объявления, и это все:
// ConstantList.h
STR_CONST(kMyConstant, "Value");
…
Несколько замечаний:
Мне пришлось переопределить макрос в файле .m
после #undef
, используя его для использования макроса.
Мне также пришлось использовать #include
вместо #import
, чтобы это работало должным образом и чтобы компилятор не видел ранее скомпилированные значения.
Это потребует перекомпиляции вашего PCH (и, вероятно, всего проекта) всякий раз, когда изменяются какие-либо значения, что не имеет место, если они разделены (и дублированы) как обычно.
Надеюсь, это кому-нибудь пригодится.