gpt4 book ai didi

ios - 构造其子类时无法访问 Swift 通用父类(super class)的 init

转载 作者:IT王子 更新时间:2023-10-29 05:19:53 25 4
gpt4 key购买 nike

我有以下代码:

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' cannot be constructed because it has no accessible initializers

如果我覆盖初始化:

override init(_ value: String) {
super.init(value)
}

会工作,但我不喜欢它。当我不会添加/修改它时,为什么需要覆盖它?

我做错了什么吗?

更新:跟进 Nikita Leonov 和 Icaro 回答的问题

首先关于所有属性必须有默认值,我认为我满足了这个规则,其中一个可选的 var 默认为 nil 值,不是吗?尽管即使我写 var value: T? = nil 没有解决。

然后来自相同的documentation “自动初始化程序继承”部分:

superclass initializers are automatically inherited if certain conditions are met

一个条件是:

If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.

我认为上面的代码确实符合要求。如果我不使用泛型,这实际上会起作用:

class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")

这条规则是否也适用于泛型类?

最佳答案

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

关于ios - 构造其子类时无法访问 Swift 通用父类(super class)的 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com