嵌套类具有不稳定的名称。使用奇怪的参数

时间:2017-11-15 13:59:24

标签: swift xcode xcode9

我们有一些代码,其中一个类嵌套在扩展中。在Xcode 9中打开项目后,我们得到的是'嵌套类具有不稳定的名称'警告。 使用Xcode自动修复时,它会生成@objc一些(生成?)参数。

例如:

struct Something {
}

extension Something {

    @objc(_TtCV16MyProject9Something4Some) class Some: NSObject, NSCoding {

        required init?(coder aDecoder: NSCoder) {

        }

        func encode(with aCoder: NSCoder) {

        }

    }
}

所有这些编译。但这是什么_TtCV16MyProject9Something4Some

它似乎是唯一的,因为如果我们在两个地方使用相同的一个,它将无法编译(一些通用的项目级编译器错误)。

如果我用其他任何内容替换_TtCV16MyProject9Something4Some(比如@objc(Something)),那么项目编译得很好,但实际上并没有更多的光。

一个重要的问题是随机生成的param还是实际桥接名称的实际链接?

2 个答案:

答案 0 :(得分:7)

  

但是这是什么_TtCV16MyProject9Something4Some

这是Something.Some的(Swift 3)错位名称。并且由于您没有指定用于将类公开给Objective-C的自定义名称,因此它也是Obj-C运行时看到该类的名称(因为Obj-C没有嵌套类的概念)。

因此,它也是编码到该类实例的NSCoding存档中的名称(允许在解码时重新构造实例;将查询Obj-C运行时的类)通过那个名字)。

您收到此错误的原因是因为name mangling for nested classes changed between Swift 3 and 4 - 可能将来再次发生变化(直到Swift至少稳定ABI为止)。因此,为了允许在Swift 4及更高版本中解码使用Swift 3受损名称编码的归档,编译器建议您使用Swift 3受损名称将类暴露给Obj-C。

如果您不需要为Swift 3提供此向后兼容性,那么您可以继续使用您自己的稳定名称将嵌套类暴露给Obj-C(以确保将来更改更改不影响存档解码)。在这种情况下,我建议使用类似@objc(Something_Some)的内容。

答案 1 :(得分:2)

我认为你的班级' name可能包含Objective-C不支持的字符。在这些情况下,您可以使用@objc(name)属性提供在Objective-C中使用的替代名称,您所看到的是自动生成的唯一名称。这也是为什么你可以用你喜欢的任何东西改变它,它会编译得很好。

Apple的文档中有一节解释了这一点,在https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID55在Objective-C中配置Swift接口