2017-10-21 115 views
2

在iOS的框架,如果我创建一个内部超一个公共类,我得到一个错误:斯威夫特类泛型允许超都无法使用

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

这是有道理的。但是,如果我在类声明中使用泛型,但不显示任何错误。

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链接程序错误。

Undefined symbols for architecture 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)没有问题,但是当你尝试归档项目,你会得到一个链接器错误。

+0

这可能是一个编译器错误。我会在bugs.swift.org上讨论它。 –

+1

完成!我提交了它,它被接受为一个错误。 –

回答

0

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