Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Objective-c中将数组声明为常量?_Objective C_Arrays_Constants - Fatal编程技术网

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

如何在Objective-c中将数组声明为常量?,objective-c,arrays,constants,Objective C,Arrays,Constants,以下代码给了我错误: // constants.h extern NSArray const *testArray; 我得到的错误是 初始值设定项元素不是常量 或者如果我拿走指针指示器(*),我得到: 静态分配的Objective-C类'NSArray'实例简而言之,您不能。Objective-C对象(NSString除外)仅在运行时创建。因此,您不能使用表达式来初始化它们 有几种方法 (1) 声明NSArray*testArray而不使用const关键字,然后使用一些代码设置在应用程序生命周

以下代码给了我错误:

//  constants.h
extern NSArray const *testArray;
我得到的错误是
初始值设定项元素不是常量

或者如果我拿走指针指示器(*),我得到:

静态分配的Objective-C类'NSArray'实例

简而言之,您不能。Objective-C对象(NSString除外)仅在运行时创建。因此,您不能使用表达式来初始化它们

有几种方法

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

(2) 声明一个方便的类方法返回数组,然后在该方法中使用一个
静态NSArray*myArray
,并将其视为一个单例(搜索“objective-c singleton”以获得关于如何实例化的无数答案)。

这很简单:

#定义arrayTitle[NSArray arrayWithObjects:@“hi”@“foo”,nil]

放在实现之前,不带分号


希望它能有所帮助。

参加聚会有点晚,但由于在整个程序过程中没有更改值,如果您只处理字符串,可以通过使用
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:
那样附加所有有趣的方法,因此您可以在程序中的某个地方创建一个helper函数,该函数使用我上面介绍的方法循环遍历所有字符串,并返回一个
NSArray
(或
NSMutableArray
偶数)。但是,如果您正在执行我所做的操作,并且只需要在整个程序中使用
NSString
值的常量数组,则此方法效果最好

这样做会将所有字符串数组contant封装在
constants.h
中,并通过在
.pch
文件中添加
constants.h
而在整个程序中仍然可用,而不是仅为该值数组创建一个单例或使用少量代码设置数组,这有点违背了
常量
文件,因为它从
常量
文件中删除了实际常量

根据@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]);
for(int i=0;i
是的,这不会动态捕获数组的大小,但如果在常量文件中声明数组,则从一开始就知道该数组的大小,因此即使它再添加两行代码,它仍然可以完成在常量文件中创建数组的任务


如果有人有更多的建议或可能知道一些其他的
C
技巧,请在下面留下评论!

这里有一个宏,可以在一行中为方法作用域中的静态实例执行此操作

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

对我来说,对常量数组使用以下实现更方便

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

基本上,当您在代码中调用ArrayOfString时,将替换为@[@“1”、@“2”、@“3”、@“4”]arraysOfIds也是一样。

这并没有真正为您提供一个常量数组,它只是在您每次使用
ArraySofitle
时生成一个新的数组,但是,它确实可以帮助以后访问线程的其他人,他们只想在头文件中声明,但不关心创建常量。它肯定不会创建常量,但是它确实生成了一个总是给出相同数组的数组,这与常量数组的作用非常相似,对吗?顺便说一句,答案很棒!不是常量数组,无论如何,购买,我的问题的最佳解决方案预处理器宏也是邪恶的。如果你只处理像问题中那样的
NSStrings
数组,你可以创建一个
C样式数组,然后使用其中的一些
C
方法来访问值。请参见@bbum——即使使用
@[…]也仍然如此
sugar,是吗?有人可能会说,由于块现在是完全成熟的可保留对象类型,它们是第二种类型的Objective-C对象,编译器知道布局并可以创建常量实例。可以从块文字初始化静态存储持续时间变量。@NikolaiRuhe是真的,但这对al来说是一件非常痛苦的事对于静态块初始化来说,它的值很低,但是编译器会给你一个“非静态初始化器”错误,并且有一个看似无害的更改。这是不正确的。sizeof()返回内存大小。这可能要经过8次迭代,但在third@JesseGumpo,谢谢你的评论。在我的实际实现中,我为数组大小创建了一个int常量,而不是使用
sizeof()
。将编辑我的答案以反映我的最终方法,因为它使用简单的数据类型,所以仍然有效并完成在常量文件中包含数组的任务。“sizeof(my_CONSTANT_STRING_array)/sizeof(my_CONSTANT_STRING_array[0])”“常量”是什么意思?对象的不可变内容,还是不可变指针?我的标准是:1)值不能意外更改(所以我想NSArray是好的),2)任何时候都可用
#define arrayOfStrings @[@"1", @"2", @"3", @"4"]
#define arraysOfIds @[@(1), @(2), @(3), @(4)]