我有以下代码:
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ilStringProperty<String>
class ilStringProperty<String>: ILProperty<String> {
}
let x = ILStringProperty("X")
最后一行是编译错误:
'ILStringProperty' 无法构建,因为它没有可访问的初始化程序
如果我重写init方法:
override init(_ value: String) {
super.init(value)
}
这个代码可以工作,但我不喜欢它。为什么我需要覆盖它,当我不会添加或修改它呢?
我做错了什么吗?
更新:对Nikita Leonov和Icaro的答案进行后续提问
首先是关于所有属性必须具有默认值的规则,我认为我已经满足了这个规则,其中一个可选变量使用nil值作为默认值,不是吗?尽管即使我写var value: T? = nil
也不能解决这个问题。
然后从同一文档中“自动初始化程序继承”部分:
如果满足某些条件,则自动继承超类初始化程序
其中一个条件是:
如果您的子类没有定义任何指定初始化程序,则自动继承其超类指定初始化程序。
我认为上面的代码确实符合这个条件。如果我不使用泛型,这实际上是可行的:
class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
这个规则是否也适用于泛型类?