【问题标题】:NSArray redefinition with a different type int & missing type specifierNSArray 使用不同类型的 int 重新定义 & 缺少类型说明符
【发布时间】:2014-09-08 19:43:15
【问题描述】:

以下代码将无法构建,并提供“缺少类型说明符,默认为 'int'”的警告和错误“使用不同类型重新定义 'my_var':'int' vs 'NS Array *__strong'。

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

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

【问题讨论】:

  • 你在哪里“预定义”它?
  • @vikingosegundo 在上面的代码中。我的意思是它不是在运行时创建和填充的,而是在构建时可用的静态数组。
  • 再次:您在源代码的哪个位置“预定义”它?
  • 我创建了一个空文件,将其命名为regions.h,然后将其导入到视图的.m 文件中。
  • 伙计,显示代码。如果你在 regios.h 中有这个,那就错了。

标签: ios objective-c nsarray


【解决方案1】:

您已将该代码置于全局或文件范围内,位于任何函数或方法定义之外。你不能那样做。对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;
}

【讨论】:

  • 啊,我敢打赌就是这样!现在要去测试了。这一定是维京人暗指的。
  • 更新了更多信息和建议的解决方案。
  • 做到了!谢谢你。我从来没有想过这个 b/c 我什至不知道我应该看什么背景。
【解决方案2】:

在我看来,您希望数组的对象是字典对象:

那么为什么不试试呢:

NSArray *my_var = @[ 
    @{ @"Name1" : @312 },
    @{ @"Name2" : @313 },
];

【讨论】:

  • 很可能它应该在字典上。或者键应该相等。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多