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

Rya*_*ner 2 objective-c ios xcode11

从 XCode 10.0 升级到 11 后

我收到错误“名称”不可用:在 iOS 上不可用

这是在XCode 11.0 和 11.1 上的Build for Swift 4.2期间,我仍然可以使用 XCode 10 进行构建

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

return [(NSNumber *)[table[state] objectForKey:[rule name]] unsignedIntegerValue];
Run Code Online (Sandbox Code Playgroud)

我可以通过将变量名称重命名为ruleName来解决这个问题,但我宁愿不这样做。

为什么 Xcode 反对 name 的变量名?这是一个Xcode,还是我可以在构建设置中修复的东西

编辑

具体的pod是NUI 0.5.5

在模块 NUIPShiftReduceGotoTable.m 中

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

Kir*_*ani 6

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

目前在 Xcode 11.1 中你可以做到。

id x = nil;
[x name];
Run Code Online (Sandbox Code Playgroud)

这将编译,没问题。但:

NSObject *x = nil
[x name];
Run Code Online (Sandbox Code Playgroud)

由于编译器识别出最有可能的选择器是 NSLayoutAnchor.h 中的 API_UNAVAILABLE 一个(也许),因此不会编译。

如果编译器有更多信息,它可以映射正确的选择器。这可能就像在失败的 .m 文件中包含任何具有 name 属性的标题一样简单。

我的猜测是在 NUIPShiftReduceGotoTable.m 中添加一行 #import"NUIPRule.h"