次の点を考慮してください。
protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
func hi() -> A
}
extension FooBar {
func hello() -> A {
return hi()
}
}
class FooBarClass: FooBar {
typealias A = String
func hi() -> String {
return "hello world"
}
}
このコードはコンパイルされます。しかし、関連付けられた type の明示的な定義をコメントアウトするとtypealias A = String
、何らかの理由で、swiftc は型の推測に失敗します。
これは、同じ関連付けられた型を共有する 2 つのプロトコルに関係していると感じていますが、たとえば、型のパラメーター化 (おそらく関連付けられた型は強力ではないか、十分に成熟していないのでしょうか?) による直接的なアサーションはなく、型の推論が曖昧になります。
これが言語のバグ/未熟なのかどうかはわかりません。それとも、この動作に正当につながるプロトコル拡張のニュアンスが欠けているのかもしれません。
誰かがこれに光を当てることができますか?