【发布时间】:2017-10-21 00:48:58
【问题描述】:
在 iOS 框架中,如果我使用内部超类创建公共类,则会收到错误消息:
internal class Animal { }
public class Dog: Animal {
var name: String
public init(name: String) {
self.name = name
}
}
错误:类不能被声明为公共的,因为它的超类是内部的
这是有道理的。但是,如果我做同样的事情但在类声明中使用泛型,则不会显示错误。
internal class Car<Type: Equatable> { }
public class Camry<Type: Equatable>: Car<Type> {
var name: String
public init(name: String) {
self.name = name
}
}
这只是一个错误吗?这两个例子都应该给出错误吗?
如果您在项目中包含框架,则可以使用 Camry 类,应用程序将在模拟器和设备上构建和运行。但是,我注意到在某些情况下,如果您尝试使用这些内部泛型类归档应用程序,有时会出现 Mach-O 链接器错误。
架构 arm64 的未定义符号
但我无法确切地确定为什么偶尔会发生这种情况。
编辑:当您在内部类中有公共初始化程序时,会发生链接器错误。因此允许在框架中包含这样的代码:
internal class Car<Type: Equatable> {
var wheels: Type
public init(wheels: Type) {
self.wheels = wheels
}
}
public class Camry<Type: Equatable>: Car<Type> {
var name: String
public init(name: String, wheels: Type) {
self.name = name
super.init(wheels: wheels)
}
}
您可以在包含该框架的应用中毫无问题地使用 Camry<Int>(name: "My Camry", wheels: 4),但是当您尝试归档项目时,您会收到链接器错误。
【问题讨论】:
-
这可能是一个编译器错误。我会在 bugs.swift.org 上讨论它。
-
完成!我提交了它,它被认为是一个错误。
标签: swift generics inheritance access-levels