为什么Swift需要覆盖泛型超类的指定初始化器?

Nik*_*nov 9 generics compiler-errors initializer swift

根据Apple的文档,Swift不需要覆盖初始化程序.在以下代码示例中,Bar继承了以下的初始化程序Foo:

class Foo {
  let value: Int
  init(value: Int = 5) {
    self.value = value
  }
}

class Bar: Foo {
}
Run Code Online (Sandbox Code Playgroud)

只要我们Fooclass Foo<T> {Xcode中添加一些通用就会给我们带来错误Initializer does not override a designated initializer from its superclass.是否有文件或快速进化讨论解释了为什么会发生这种情况?


更新.通用似乎不是覆盖要求的主要原因.以下是如何定义具有泛型的类的选项,该类不需要覆盖指定的初始化程序:

protocol FooProtocol {
    associatedtype T
}

class Foo<U>: FooProtocol {
    typealias T = U

    let value: Int
    init(value: Int, otherValue: T) {
        self.value = value
        self.otherValue = otherValue
    }
}

class Bar: Foo<Int> {
}
Run Code Online (Sandbox Code Playgroud)

然而,还有另一个有趣的行为观察.定义初始化器,如下面的原因覆盖要求:

init(value: Int = 5) {
    self.value = value
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,在这样的指定初始值设定项中添加一个以下参数会导致此覆盖要求消失:

init(value: Int = 5, otherValue: T) {
    self.value = value
}
Run Code Online (Sandbox Code Playgroud)

更新2.我无法找到这种行为的合理解释,此时我将其报告为编译器错误 -  https://bugs.swift.org/browse/SR-1375

sun*_*ejr 1

我实际上填写了一个从泛型类继承的错误报告:

\n\n

在此输入图像描述

\n\n

时间回到去年11月份,还没有得到答案,所以 \xc2\xaf_(\xe3\x83\x84)_/\xc2\xaf

\n