Swift通用超类'init在构造其子类时不可访问

时间:2015-06-25 02:06:03

标签: 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 = 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")

此规则是否也适用于通用类?

4 个答案:

答案 0 :(得分:1)

代码示例中的最后一行不再产生编译错误(自Swift 3起)。 <{3}}中没有提到这一点,所以我只能假设这是一个错误。

答案 1 :(得分:0)

来自apple documentation

  

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处理初始化程序的方式在概念上更好。