这是我的代码:
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;这似乎与我有关。
答案 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中没有提到这种变化,所以我只能假设这是一个错误。