2014-10-02 78 views
0

我有我的头文件中的一个静态的NSString consts的集合,我想在一个新的静态的NSArray利用(或的NSString []),但我遇到了以下错误如何创建静态NSString常量的静态NSString []?

Initializer Element is not a compile-time constant 

我的字符串和阵列设置如下:

static NSString * const SOMEVAL = @"val"; 
static NSString * const SOMEKEY = @"key"; 

static NSString *KEYLIST[] = { SOMEVAL, SOMEKEY }; 

是否有可能得到这个静态数组以这种方式编译或将先前宣布NSString的始终显示为无编译时间常数?

+0

请注意'静态NSString * KEYLIST []'没有描述NSArray。 – 2014-10-02 18:33:00

+0

更新标题以反映@HotLicks评论 – Maixy 2014-10-02 18:34:11

回答

1

编译器不会将对象视为“编译时常量”。你将不得不做两个解决方法之一。

您可以使用预处理器定义为字符串:

#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是另一回事。

0

您不应该在头文件中使用静态。在标题宣告:

extern NSString * const SOMEVAL; 
extern NSString * const SOMEKEY; 

extern NSString *KEYLIST[]; 

,然后在源文件中定义:

NSString * const SOMEVAL = @"val"; 
NSString * const SOMEKEY = @"key"; 

NSString *KEYLIST[] = { SOMEVAL, SOMEKEY }; 
0

如果你愿意依靠编译器结合相同的字符串常量(一个相当安全的赌注),你可以代之以:

#define SOMEVAL @"val" 
#define SOMEKEY @"key" 

static NSString *KEYLIST[] = { SOMEVAL, SOMEKEY };