来自泛型类型的初始化器不会在swift中继承吗?

时间:2015-12-30 08:01:25

标签: swift generics initializer

这是我的代码:

public class A<T : Any> { 
    public init(n : Int) { 
        print("A")
    } 
} 
public class B : A<Int> {
}
public class C : B {
}
let x = C(n: 123)

编译失败并大喊这样的错误:

repl.swift:9:9: error: 'C' cannot be constructed because it has no accessible initializers

可以编译以下代码。

public class A { 
    public init(n : Int) { 
        print("A")
    } 
} 
public class B : A {
}
public class C : B {
}
let x = C(n: 123)

不应该是需求类型指定的泛型类型&#39;初始化者是继承的吗?

========以下附加内容=======

  

“Superclass初始值设定项在某些情况下是继承的,但只有在安全且适当的情况下才会继承。有关更多信息,请参阅下面的“自动初始化程序继承”   --- Apple Inc.“The Swift Programming Language(Swift 2)”iBooks。

这个

  

“但是,如果满足某些条件,则会自动继承超类初始值设定项。”

     

“假设您为在子类中引入的任何新属性提供默认值,以下两条规则适用:”   规则1   “如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。”   规则2   “如果您的子类提供了所有超类指定初始化器的实现 - 通过按照规则1继承它们,或者通过提供自定义实现作为其定义的一部分 - 那么它会自动继承所有超类便利初始化器。” p>

当查看第一个代码时,子类B没有定义任何指定的初始化器,它应该自动继承其所有超类指定的初始化器,来自A<Int>。但实际上它没有&# 39;这似乎与我有关。

2 个答案:

答案 0 :(得分:1)

怎么样?我尝试使用覆盖代码和super.init,这不是错误。我认为你不必使用泛型类型的init函数。

尝试在类B和类C中放置override init函数。 看起来像这样,

public override init(n:Int) { super.init(n: n) }

答案 1 :(得分:0)

现在编译失败的代码(自Swift 3起)。 Swift 3 Language changes中没有提到这种变化,所以我只能假设这是一个错误。