2

在 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)在包含该框架的应用程序中毫无问题地使用,但是当您尝试归档项目时,您会收到链接器错误。

4

1 回答 1

0

正如 Rob Napier 所建议的,这确实是一个错误。它在 bugs.swift.org 上被接受为问题 SR-6206,应该在 Swift 4.1 中修复。

于 2017-11-25T15:42:01.257 回答