Một sửa đổi nhỏ về đề xuất của @Krizz, để nó hoạt động chính xác nếu tệp tiêu đề hằng được đưa vào PCH, điều này khá bình thường. Vì bản gốc được nhập vào PCH, nó sẽ không tải lại vào .m
tệp và do đó bạn không nhận được biểu tượng nào và trình liên kết không hài lòng.
Tuy nhiên, sửa đổi sau đây cho phép nó hoạt động. Đó là một chút phức tạp, nhưng nó hoạt động.
Bạn sẽ cần 3 tệp, .h
tệp có định nghĩa không đổi, .h
tệp và.m
tệp, tôi sẽ sử dụng ConstantList.h
, Constants.h
và Constants.m
, tương ứng. nội dung Constants.h
đơn giản là:
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
và Constants.m
tập tin trông như:
// Constants.m
#ifdef STR_CONST
#undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"
Cuối cùng, ConstantList.h
tệp có các khai báo thực tế trong đó và đó là tất cả:
// ConstantList.h
STR_CONST(kMyConstant, "Value");
…
Một vài điều cần lưu ý:
Tôi đã phải xác định lại macro trong .m
tệp sau #undef
nó cho macro được sử dụng.
Tôi cũng đã phải sử dụng #include
thay vì #import
để điều này hoạt động chính xác và tránh trình biên dịch nhìn thấy các giá trị được biên dịch trước đó.
Điều này sẽ yêu cầu biên dịch lại PCH của bạn (và có thể là toàn bộ dự án) bất cứ khi nào bất kỳ giá trị nào bị thay đổi, đó không phải là trường hợp nếu chúng được tách (và sao chép) như bình thường.
Hy vọng rằng nó hữu ích cho một ai đó.