2014-10-02 39 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 };