我有以下代码:
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的回答问题
首先关于所有属性必须具有默认值,我确实认为我满足这个规则,其中可选var默认为nil值,不是吗?虽然我写var value: T? = nil
并没有解决它。
然后从同一documentation部分“自动初始化程序继承”:
如果满足某些条件,则会自动继承超类初始值设定项
一个条件是:
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。
我确实认为上面的代码符合要求。如果我不使用泛型,这实际上会起作用:
class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
此规则是否也适用于通用类?
答案 0 :(得分:1)
代码示例中的最后一行不再产生编译错误(自Swift 3起)。 <{3}}中没有提到这一点,所以我只能假设这是一个错误。
答案 1 :(得分:0)
Swift为任何结构或基类提供默认初始值设定项 它提供了所有属性的默认值,但没有 至少提供一个初始化程序。默认的初始化程序 只需创建一个新实例,并将其所有属性设置为它们 默认值。
你的类ilStringProperty不是一个基类,因为它继承自ILProperty所以它必须有一个初始化程序,如果你创建一个或覆盖一个并不重要,因为你的类中至少有一个初始化程序,因为swift不会给一个免费。
答案 2 :(得分:0)
正如ganzogo提到的,它似乎与最新的Swift(3.0)一起正常工作。另外,为什么要声明一个单独的类来分配给typealias
?我在游乐场试过这个,看起来还不错:
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ILProperty<String>
let x = ILStringProperty("X")
答案 3 :(得分:-1)
以下是Apple文档的另一个引用
与Objective-C中的子类不同,Swift子类不会继承 默认情况下,它们的超类初始值设定项。斯威夫特的方法阻止了 继承超类中的简单初始值设定项的情况 由一个更专业的子类,用于创建一个新的实例 未完全或正确初始化的子类。
在Swift Programming Language document from apple外观部分“初始化程序继承和覆盖”中。
我不明白你的挫败感,但Swift处理初始化程序的方式在概念上更好。