如何在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相同。