アップルの文書によると、Swiftはイニシャライザを無効にする必要はありません。すぐに我々はXcodeのは間違いInitializer does not override a designated initializer from its superclass
を提供Foo
などclass Foo<T> {
ように、いくつかの一般的なを追加するとSwiftは汎用スーパークラスの指定イニシャライザをオーバーライドする必要があるのはなぜですか?
class Foo {
let value: Int
init(value: Int = 5) {
self.value = value
}
}
class Bar: Foo {
}
:次のコード例ではBar
はFoo
の初期化子を継承します。それが起こっている理由を説明するドキュメンテーションまたは迅速な進化の議論はありますか?
更新。ジェネリックはオーバーライド要件の主要な原因ではないようです。指定されたイニシャライザのオーバーライドを必要としないジェネリックでクラスを定義する方法を次に示します:
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> {
}
しかし、もう1つの興味深い動作の観察があります。
init(value: Int = 5) {
self.value = value
}
面白い事このオーバーライド要件が消滅するように指定イニシャライザの原因に次のように、1つの以上のパラメータを追加すること:
init(value: Int = 5, otherValue: T) {
self.value = value
}
アップデート2原因オーバーライド要件を以下のように初期化子を定義します。それは戻っていた
:私は実際にジェネリッククラスから継承するためにバグレポートを満たさhttps://bugs.swift.org/browse/SR-1375
もう少しテストしましたが、問題はデフォルト値_のようです。あなたのサンプルから '= 5 'を取り出し、その中の_none_はコンパイラエラーを引き起こします。 – matt