使用不同类型的NSArray重新定义int&缺少类型说明符

时间:2014-09-08 19:43:15

标签: ios objective-c nsarray

以下代码不会构建,并提供"缺少类型说明符的警告,默认为' int'"和错误"重新定义' my_var'使用不同的类型:' int' vs' NS阵列* __强'。

NSArray *my_var = nil;
my_var = @[
  @[@312, @"Name1"],
  @[@313, @"Name2"]
];

我错过了什么?我尝试了很多不同的重构,并且由于某种原因无法使用预定义的NSArray进行编译。

2 个答案:

答案 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 },
];