'name' 不可用:iOS - XCode11 不可用

'name' is unavailable: not available on iOS - XCode11

从 XCode 10.0 升级到 11

我收到错误 'name' 不可用:iOS

不可用

这是在 Swift 4.2 XCode 11.0 和 11.1 上构建期间,我仍然可以使用 XCode 10[=15 进行构建=]

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

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

我可以通过将变量 name 重命名为 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];
}

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

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

id x = nil;
[x name];

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

NSObject *x = nil
[x name];

不会编译,因为编译器识别出最有可能的选择器是 NSLayoutAnchor.h 中的 API_UNAVAILABLE(可能)。

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

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