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

以下代码给我错误:

// 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'

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

有一些方法。

(1)声明不带const关键字的NSArray *testArray ,然后有一些代码设置在应用程序生命周期中很早被调用的值。

(2)声明一个返回数组的方便的类方法,然后在该方法内使用一个static NSArray *myArray ,并把它当作一个单例(对于如何实例化的大约十亿个答案,在SO中search“objective-c singleton”)。

有点迟到派对,但是因为你没有改变程序的价值,如果你只是处理string,你可以通过使用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:那样获得所有有趣的方法objectAtIndex:所以你可以在你的程序的某个地方创build一个辅助函数,使用方法I遍历所有的string如上所述,并返回一个NSArray (或甚至NSMutableArray )。 但是,如果你正在做我所做的,只需要一个在整个程序中使用的常量NSString值的数组,那么这种方法是最好的。

这样做将所有string数组封装在constants.h ,并且在整个程序中仍然可用,方法是在.pch文件中添加constants.h ,而不是为这个值的数组创build一个singleton,或者使用很less的代码,这种sorta击败了constants文件的目的,因为它从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]); 

是的,这不会dynamic捕获数组的大小,但是如果你在一个常量文件中声明一个数组,你从一开始就已经知道数组的大小,所以即使它增加了两行代码,仍然完成了在一个常量文件中有一个数组的任务。

如果有人有任何更多的build议或可能知道一些其他的C技巧,请在下面留言!

下面是一个macros在一行中为一个方法范围内的一个静态实例完成的。

 #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]); 

这很容易:

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

在执行之前并没有分号。

希望能帮助到你。

对于我来说,使用下面的一些常量实现会更方便一些

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

我有一个名为“Constants.h”的头文件,在下一个常量数组中:

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

基本上,当你在你的代码中调用arrayOfStrings时,被replace为@ [@“1”,@“2”,@“3”,@“4”],而与arraysOfId相同。