如何创建静态NSString常量的静态NSString []?

时间:2014-10-02 18:24:26

标签: objective-c static nsstring nsarray const

我在我的一个头文件中有一组静态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是否总是显示为非编译时常量?

3 个答案:

答案 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 };