我们有一些代码,其中一个类嵌套在扩展中。在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还是实际桥接名称的实际链接?
答案 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接口