Uma leve modificação na sugestão do @Krizz, para que funcione corretamente se o arquivo de cabeçalho das constantes for incluído na PCH, o que é bastante normal. Como o original é importado para a PCH, ele não será recarregado no .marquivo e, portanto, você não recebe símbolos e o vinculador está descontente.
No entanto, a seguinte modificação permite que ele funcione. É um pouco complicado, mas funciona.
Você vai precisar de 3 arquivos, .harquivo que tem as definições constantes, o .harquivo e o .marquivo, eu vou usar ConstantList.h, Constants.he Constants.m, respectivamente. o conteúdo de Constants.hsão simplesmente:
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
e o Constants.marquivo se parece com:
// Constants.m
#ifdef STR_CONST
#undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"
Finalmente, o ConstantList.harquivo possui as declarações reais e isso é tudo:
// ConstantList.h
STR_CONST(kMyConstant, "Value");
…
Algumas coisas a serem observadas:
Eu tive que redefinir a macro no .marquivo após #undef inseri-la na macro a ser usada.
Eu também tive que usar em #includevez disso #importpara que funcionasse corretamente e evitar que o compilador visse os valores pré-compilados anteriormente.
Isso exigirá uma recompilação do seu PCH (e provavelmente todo o projeto) sempre que quaisquer valores forem alterados, o que não acontece se forem separados (e duplicados) normalmente.
Espero que seja útil para alguém.