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 .m
arquivo 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, .h
arquivo que tem as definições constantes, o .h
arquivo e o .m
arquivo, eu vou usar ConstantList.h
, Constants.h
e Constants.m
, respectivamente. o conteúdo de Constants.h
são simplesmente:
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
e o Constants.m
arquivo 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.h
arquivo 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 .m
arquivo após #undef
inseri-la na macro a ser usada.
Eu também tive que usar em #include
vez disso #import
para 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.