如何在Objective-c中将数组声明为常量?

时间:2010-03-12 23:04:24

标签: objective-c arrays constants

以下代码给出了错误:

//  constants.h
extern NSArray const *testArray;
//  constants.m
NSArray const *testArray = [NSArray arrayWithObjects:  @"foo", @"bar", nil];

我得到的错误是 initializer element is not constant

或者,如果我拿走指针指针(*),我会得到:
 statically allocated instance of Objective-C class 'NSArray'

6 个答案:

答案 0 :(得分:69)

总之,你不能。除了NSString常量之外,Objective-C对象只在运行时创建,因此,您不能使用表达式来初始化它们。

有一些方法。

(1)在没有NSArray *testArray关键字的情况下声明const,然后使用一些代码来设置应用程序生命周期中很早就调用的值。

(2)声明一个方便的类方法,返回数组,然后在该方法中使用static NSArray *myArray并将其视为单例(搜索SO为“objective-c singleton”,获取大约数十亿的答案实例化。。

答案 1 :(得分:33)

派对有点晚了,但由于你没有在程序过程中更改值,如果你只处理字符串,你可以通过使用C声明你的数组来做到以下几点阵列:

extern NSString * const MY_CONSTANT_STRING_ARRAY[];

在您的constants.h文件中,然后在constants.m中,您可以像这样添加对象:

NSString * const MY_CONSTANT_STRING_ARRAY[] = { @"foo", @"bar" };

然后,要访问某个成员,您可以使用C sizeof()运算符执行for循环:

这显然是一个C数组,而不是NSArray所以你没有像objectAtIndex:那样得到所有有趣的方法,所以你可以在某处创建一个辅助函数在您的程序中,使用上面概述的方法遍历所有字符串并返回NSArray(或NSMutableArray偶数)。但是,如果你正在做我自己的事情,并且只需要在整个程序中使用一系列NSString值,那么这种方法效果最好。

这样做可以在constants.h中封装所有字符串数组内容,并且在您的constants.h文件中添加.pch而不是仅为了创建单身内容而在整个程序中仍然可用这个值数组或者使用一些代码设置数组,这会使constants文件的目的失效,因为它会删除constants文件中的实际常量..

编辑@ JesseGumpo的评论

由于使用sizeof()确定数组的大小可能存在问题,因此一个简单的解决方法是在常量文件中声明数组的大小,如下所示:

//.h
extern int SIZE_OF_MY_CONSTANTS_ARRAY;  

///.m
int SIZE_OF_MY_CONSTANTS_ARRAY = 2;

然后在for循环中访问成员,你可以这样做:

for (int i=0; i < SIZE_OF_MY_CONSTANTS_ARRAY; i++) 
        NSLog(@"my constant string is: %@", MY_CONSTANT_STRING_ARRAY[i]);

是的,这不会动态捕获数组的大小,但是如果你在常量文件中声明一个数组,你从一开始就知道了该数组的大小,那么即使它再增加了两行代码,它仍然完成了在常量文件中使用数组的任务。

如果有人有任何更多建议或可能知道其他一些C技巧,请在下方发表评论!

答案 2 :(得分:9)

这是一个宏,可以在一行中为方法范围中的静态实例执行此操作。

#define STATIC_ARRAY(x, ...)   \
        static NSArray* x=nil; \
        static dispatch_once_t x##onceToken; \
        dispatch_once(&x##onceToken, ^{ x = @[ __VA_ARGS__ ]; });

使用示例

    STATIC_ARRAY(foo, @"thing1", @"thing2", [NSObject new]);

答案 3 :(得分:6)

这很简单:

#define arrayTitle [NSArray arrayWithObjects: @"hi",@"foo",nil]

在实施前放置,不带分号。

希望它有所帮助。

答案 4 :(得分:6)

对于我来说,将以下实现用于常量数组

更方便
static NSString * kHeaderTitles [3] = {@ "ACCOUNT DETAILS", @ "SOCIAL NETWORK", @ "SETTINGS"};
static int kNumbers[3] = {1, 2, 3};

答案 5 :(得分:3)

我有一个名为&#34的头文件; Constants.h&#34;并在下一个常量数组中:

#define arrayOfStrings @[@"1", @"2", @"3", @"4"]
#define arraysOfIds @[@(1), @(2), @(3), @(4)]

基本上,当您在代码中调用arrayOfStrings时,将替换为@ [@&#34; 1&#34;,@&#34; 2&#34;,@&#34; 3&#34;,@& #34; 4&#34;]与arraysOfIds相同。