Swift 类 与泛型允许 super类 不可访问
Swift classes with generics allow superclasses to be inaccessible
在 iOS 框架中,如果我创建一个带有内部超级 class 的 public class,我会得到一个错误:
internal class Animal { }
public class Dog: Animal {
var name: String
public init(name: String) {
self.name = name
}
}
Error: Class cannot be declared public because its superclass is internal
这是有道理的。但是,如果我做同样的事情但在 class 声明中使用泛型,则不会显示任何错误。
internal class Car<Type: Equatable> { }
public class Camry<Type: Equatable>: Car<Type> {
var name: String
public init(name: String) {
self.name = name
}
}
这只是一个错误吗?这两个示例实际上都应该给出错误吗?
如果您在项目中包含框架,则可以很好地使用 Camry
class,应用程序将在模拟器和设备上构建和 运行。但是,我注意到在某些情况下,如果您尝试使用这些内部通用 classes 归档应用程序,您有时会遇到 Mach-O 链接器错误。
Undefined symbols for architecture arm64
我还不能确定为什么偶尔会发生这种情况。
编辑:当您在内部 class 中有一个 public 初始值设定项时,就会发生链接器错误。所以允许在框架中包含这样的代码:
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)
,但是当您尝试存档项目时,您会遇到链接器错误。
正如 Rob Napier 所建议的,这确实是一个错误。它在 bugs.swift.org 上作为问题 SR-6206 被接受,应该在 Swift 4.1.
中修复
在 iOS 框架中,如果我创建一个带有内部超级 class 的 public class,我会得到一个错误:
internal class Animal { }
public class Dog: Animal {
var name: String
public init(name: String) {
self.name = name
}
}
Error: Class cannot be declared public because its superclass is internal
这是有道理的。但是,如果我做同样的事情但在 class 声明中使用泛型,则不会显示任何错误。
internal class Car<Type: Equatable> { }
public class Camry<Type: Equatable>: Car<Type> {
var name: String
public init(name: String) {
self.name = name
}
}
这只是一个错误吗?这两个示例实际上都应该给出错误吗?
如果您在项目中包含框架,则可以很好地使用 Camry
class,应用程序将在模拟器和设备上构建和 运行。但是,我注意到在某些情况下,如果您尝试使用这些内部通用 classes 归档应用程序,您有时会遇到 Mach-O 链接器错误。
Undefined symbols for architecture arm64
我还不能确定为什么偶尔会发生这种情况。
编辑:当您在内部 class 中有一个 public 初始值设定项时,就会发生链接器错误。所以允许在框架中包含这样的代码:
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)
,但是当您尝试存档项目时,您会遇到链接器错误。
正如 Rob Napier 所建议的,这确实是一个错误。它在 bugs.swift.org 上作为问题 SR-6206 被接受,应该在 Swift 4.1.
中修复