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 .mtệ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, .htệp có định nghĩa không đổi, .htệp và.m tệp, tôi sẽ sử dụng ConstantList.h, Constants.hvà 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.mtậ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.htệ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 .mtệ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 đó.