Ios Swift泛型超类&x27;构造其子类时无法访问init
我有以下代码:Ios Swift泛型超类&x27;构造其子类时无法访问init,ios,swift,Ios,Swift,我有以下代码: class ILProperty<T> { var value: T? init(_ value: T) { self.value = value } } typealias ILStringProperty = ilStringProperty<String> class ilStringProperty<String>: ILProperty<String> { } let x = I
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")
可以,但我不喜欢。当我不添加/修改它时,为什么需要覆盖它
我做错什么了吗
更新:尼基塔·列昂诺夫和伊卡洛回答的后续问题
首先,关于所有属性都必须有默认值,我认为我满足了这个规则,可选的var默认为nil值,不是吗?即使我写var值:T?=nil
无法解决此问题
然后从同一节“自动初始值设定项继承”:
如果满足某些条件,超类初始值设定项将自动继承
一个条件是:
如果您的子类没有定义任何指定的初始值设定项,它将自动继承其所有超类指定的初始值设定项
我确实认为上面的代码符合。如果我不使用泛型,这实际上会起作用:
class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
此规则是否也适用于泛型类?来自:
Swift为任何结构或基类提供默认初始值设定项
为其所有属性提供默认值,但不
至少提供一个初始值设定项本身。默认初始值设定项
只需创建一个新实例,并将其所有属性设置为
默认值
您的类ilStringProperty不是基类,因为它继承自ILProperty,因此它必须有一个初始值设定项,如果您创建一个或重写一个初始值设定项,这并不重要,因为您的类中至少有一个初始值设定项,因为swift不会免费提供一个初始值设定项。以下是Apple文档中的另一个引用 与Objective-C中的子类不同,Swift子类不继承 默认情况下,它们的超类初始值设定项。斯威夫特的方法阻止了一场战争 继承超类中的简单初始值设定项的情况 由更专门化的子类创建,并用于创建 未完全或正确初始化的子类 在“初始值设定项继承和重写”一节中
我不理解您的沮丧,但斯威夫特处理初始值设定项的方法在概念上更好。代码示例的最后一行不再给出编译错误(因为斯威夫特3)。在中没有提到这一点,因此我只能假设这是一个bug。如前所述,它似乎可以与最新的Swift(3.0)配合使用。另外,为什么要声明一个单独的类来分配给
typealias
?我在操场上试过这个,看起来还可以:
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ILProperty<String>
let x = ILStringProperty("X")
class属性{
var值:T?
初始值(u值:T){
自我价值=价值
}
}
typealias ILStringProperty=ILProperty
设x=ILStringProperty(“x”)
Hm.你说得对。考虑到这些规则,它应该继承。它适用于非泛型类,但在泛型类上失败——这是一个非常有趣的例子。我在苹果开发者论坛上也发现了类似的问题,但还没有得到回答-感谢类似的问题链接在你粘贴的阶段之后还有一个注释。
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ILProperty<String>
let x = ILStringProperty("X")