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

Objective c 如何创建静态NSString常量的静态NSString[]?,objective-c,static,nsstring,nsarray,constants,Objective C,Static,Nsstring,Nsarray,Constants,我的一个头文件中有一个静态NSString常量集合,我想在新的静态NSArray(或NSString[])中使用它,但遇到以下错误 Initializer Element is not a compile-time constant 我的字符串和数组设置如下: static NSString * const SOMEVAL = @"val"; static NSString * const SOMEKEY = @"key"; static NSString *KEYLIST[] = { SO

我的一个头文件中有一个静态NSString常量集合,我想在新的静态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 };

是否可以以这种方式编译此静态数组,或者以前声明的NSString是否始终显示为非编译时常量?

您不应该在头文件中使用static。在标题中声明:

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

extern NSString *KEYLIST[];
然后在源文件中定义:

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

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

如果您愿意依赖编译器组合相同的字符串常量(这是一个相当安全的赌注),您可以这样做:

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

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

编译器永远不会将对象视为“编译时常量”;你必须做两个变通方法中的一个

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

#define KEY @"key"
#define VAL @"val"

static NSString * const key = KEY;
static NSString * const val = VAL;

static NSString * keyVal[] = { KEY, VAL };
或者,您可以在函数或方法中初始化数组,该函数或方法保证在需要数组之前被调用。唯一的选择是:

static NSString * keyVal[2];

__attribute__((constructor))
void setKeyVal(void)
{
    keyVal[0] = key;
    keyVal[1] = val;
}

密切相关的类的名称是另一个。

注意,
static NSString*KEYLIST[]
没有描述NSArray。更新了标题以反映@HotLicks注释