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.

中修复