“名称”不可用:在iOS上不可用-XCode11

时间:2019-10-16 07:37:20

标签: ios objective-c xcode11

从XCode 10.0升级到11后

我收到错误消息'name'不可用:在iOS上不可用

这是在XCode 11.0和11.1上针对 Swift 4.2 进行构建的过程中,我仍然可以使用XCode 10进行构建

这是在我们通过Cocopods使用的 Objective C 外部库之一的代码中发生的。

return [(NSNumber *)[table[state] objectForKey:[rule name]] unsignedIntegerValue];

我可以通过将变量 name 重命名为 ruleName 来解决此问题,但我不想这样做。

为什么Xcode反对名称的变量名?这是Xcode,还是我可以在构建设置中解决的问题

编辑

特定的广告连播为 NUI 0.5.5

在NUIPShiftReduceGotoTable.m模块中

- (NSUInteger)gotoForState:(NSUInteger)state rule:(NUIPRule *)rule
{
    return [(NSNumber *)[table[state] objectForKey:[rule name]] unsignedIntegerValue];
}

1 个答案:

答案 0 :(得分:2)

Apple进行了更改,可能会破坏以前在Xcode 11.0 / 11.1中进行编译的代码。以前,编译器可以通过将“名称”消息传递给它不知道类型的对象来很好。在弱类型的Objective-C世界中,发生这种情况的原因可能很多。

当前可以在Xcode 11.1中完成。

id x = nil;
[x name];

这将编译,没有问题。但是:

NSObject *x = nil
[x name];

由于编译器在NSLayoutAnchor.h中(可能是)识别出最有可能的选择器是API_UNAVAILABLE选择器,因此无法编译。

如果编译器具有更多信息,则可以映射正确的选择器。这可能很简单,只要在失败的.m文件中包含具有name属性的标头即可。

我的猜测就像是在NUIPShiftReduceGotoTable.m中添加一行 #import“ NUIPRule.h”