【问题标题】:Swift classes with generics allow superclasses to be inaccessible带有泛型的 Swift 类允许超类不可访问
【发布时间】: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&lt;Int&gt;(name: "My Camry", wheels: 4),但是当您尝试归档项目时,您会收到链接器错误。

【问题讨论】:

  • 这可能是一个编译器错误。我会在 bugs.swift.org 上讨论它。
  • 完成!我提交了它,它被认为是一个错误。

标签: swift generics inheritance access-levels


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多