Небольшая модификация предложения @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 (и, вероятно, всего проекта) всякий раз, когда какие-либо значения будут изменены, что не имеет место, если они разделены (и дублированы) как обычно.
Надеюсь, что это полезно для кого-то.