我在我的一个头文件中有一组静态NSString consts,我想在新的静态NSArray(或NSString [])中使用它但是遇到了以下错误
Initializer Element is not a compile-time constant
我的字符串和数组设置如下:
static NSString * const SOMEVAL = @"val";
static NSString * const SOMEKEY = @"key";
static NSString *KEYLIST[] = { SOMEVAL, SOMEKEY };
是否可以以这种方式获取此静态数组,或者先前声明的NSStrings是否总是显示为非编译时常量?
答案 0 :(得分:2)
编译器永远不会将对象视为"编译时常量&#34 ;;你将不得不做两个解决方法之一。
您可以对字符串使用预处理程序定义:
#define KEY @"key"
#define VAL @"val"
static NSString * const key = KEY;
static NSString * const val = VAL;
static NSString * keyVal[] = { KEY, VAL };
或者您可以在保证在需要数组之前调用的函数或方法中初始化数组。 constructor
function attribute是一个选项:
static NSString * keyVal[2];
__attribute__((constructor))
void setKeyVal(void)
{
keyVal[0] = key;
keyVal[1] = val;
}
密切相关的班级的+initialize
method是另一个。
答案 1 :(得分:0)
您不应在头文件中使用static。在标题声明:
extern NSString * const SOMEVAL;
extern NSString * const SOMEKEY;
extern NSString *KEYLIST[];
然后在源文件中定义:
NSString * const SOMEVAL = @"val";
NSString * const SOMEKEY = @"key";
NSString *KEYLIST[] = { SOMEVAL, SOMEKEY };
答案 2 :(得分:0)
如果您愿意依赖编译器组合相同的字符串常量(相当安全的赌注),您可以这样做:
#define SOMEVAL @"val"
#define SOMEKEY @"key"
static NSString *KEYLIST[] = { SOMEVAL, SOMEKEY };