【发布时间】:2016-08-25 18:24:44
【问题描述】:
根据 Apple 的文档,Swift 不需要重写初始化程序。在下面的代码示例中,Bar 继承了 Foo 的初始化器:
class Foo {
let value: Int
init(value: Int = 5) {
self.value = value
}
}
class Bar: Foo {
}
只要我们在Foo 中添加一些泛型,例如class 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> {
}
但是,还有另一个有趣的行为观察结果。定义如下初始化器导致覆盖要求:
init(value: Int = 5) {
self.value = value
}
有趣的是,在这样的指定初始化程序中添加一个如下参数会导致此覆盖要求消失:
init(value: Int = 5, otherValue: T) {
self.value = value
}
更新 2。我找不到对此行为的合理解释,此时我将其报告为编译器错误 - https://bugs.swift.org/browse/SR-1375
【问题讨论】:
-
我做了更多测试,问题似乎是默认值。从您的示例中取出
=5,其中 none 会导致编译器错误。
标签: swift generics compiler-errors initializer