以下代码不会构建,并提供"缺少类型说明符的警告,默认为' int'"和错误"重新定义' my_var'使用不同的类型:' int' vs' NS阵列* __强'。
NSArray *my_var = nil;
my_var = @[
@[@312, @"Name1"],
@[@313, @"Name2"]
];
我错过了什么?我尝试了很多不同的重构,并且由于某种原因无法使用预定义的NSArray
进行编译。
答案 0 :(得分:2)
您已将该代码放在全局或文件范围内,不在任何函数或方法定义之外。你不能这样做。 my_var
的第二个赋值仅在函数或方法体内有效。在函数/方法体之外,编译器认为第二行是另一个变量声明,其(默认)类型为int
。
您无法静态将my_var
初始化为NSArray
字面值。 NSArray
字面值与文字NSString
不同。文本NSString
由编译器创建,并在可执行文件中完全可用。 NSArray
文字变成代码,在运行时(在封面下)调用方法来创建数组。该代码仅允许在函数或方法体内。
如果需要全局常量NSArray
,请使用一次创建数组的全局函数,并且每次都返回它。在.h
这样的文件中声明它:
NSArray *my_var();
并在.m
文件中定义,如下所示:
NSArray *my_var() {
static dispatch_once_t once;
static NSArray *array;
dispatch_once(&once, ^{
array = @[
@[@312, @"Name1"],
@[@313, @"Name2"]
];
});
return array;
}
答案 1 :(得分:1)
在我看来,你希望你的数组对象是字典对象:
为什么不尝试:
NSArray *my_var = @[
@{ @"Name1" : @312 },
@{ @"Name2" : @313 },
];