2016-04-30 15 views
9

アップルの文書によると、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 { 
} 

:次のコード例ではBarFooの初期化子を継承します。それが起こっている理由を説明するドキュメンテーションまたは迅速な進化の議論はありますか?


更新。ジェネリックはオーバーライド要件の主要な原因ではないようです。指定されたイニシャライザのオーバーライドを必要としないジェネリックでクラスを定義する方法を次に示します:

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原因オーバーライド要件を以下のように初期化子を定義します。それは戻っていた

enter image description here

:私は実際にジェネリッククラスから継承するためにバグレポートを満たさhttps://bugs.swift.org/browse/SR-1375

+0

もう少しテストしましたが、問題はデフォルト値_のようです。あなたのサンプルから '= 5 'を取り出し、その中の_none_はコンパイラエラーを引き起こします。 – matt

答えて

1

- 私はこの行動に論理的な説明を見つけることができない、この時点で私は、コンパイラのバグとして報告しましたin November昨年と回答していないので、まだ回答がありませんでした。

+0

ありがとうございます。私はこの問題を経験しているだけではないことを知っていることは間違いありません。その間、私はこのメッセージを答えとして数えることはできません。このトピックに関する文書化も迅速な進化論議でもありません。 –

+0

私は同意する:非常に興味深い、しかしこれはコメントではなく、答えです。 – matt

1

明らかにバグです。さらに、一般的なサブクラス化によってであるにもかかわらず、の原因がデフォルト値です。これはうまくコンパイル:

class Foo<T> { 
    let value: Int 
    init(value: Int) { 
     self.value = value 
    } 
} 

class Bar: Foo<String> { 
} 

しかし、これはしません:差異なし

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

class Bar: Foo<String> { 
} 

任意の区別のその種が、これはコンパイラのバグであることを確認してください兆候です。

+0

私は、もちろん私が証明することはできませんが、コンパイラにとって混乱していることが判明していることは、 'value'を使わずに' init(value:Int = 5) 'を呼び出すことは' init '。ジェネリックの場合はなぜそれが混乱しているのかわかりませんが、それはあなたの例が指し示すような方向です。 – matt

関連する問題