2017-12-19 11 views
2

プロトコルA(後者は関連する型Cを含む)を拡張するプロトコルBを定義しようとしていますが、コンパイラと同じ型制約示唆している。しかし、これを行うと、コードはもうコンパイルされません。これはSwiftバグですか(この場合、Swift 4)?より具体的には同じ型制約を使用する関連型とのスウィートプロトコルの適合

、以下のコードは、エラーでコンパイルされない:

タイプ「E」は、プロトコルに準拠していない以下の指定されたとおり '

class D { 

} 

protocol A: class { 
    associatedtype C: AnyObject 
} 

protocol B: A where C == D { 

} 

class E: B { 

} 

は、プロトコルBの定義を変更しますコンパイルされますが、代わりに、この警告が表示されます:「」より良いプロトコル

で同じタイプの制約として表現されるプロトコルからの関連するタイプ「C」をオーバーライド

Typealiasそれは警告なしでコンパイル作る

protocol B: A { 
    typealias C = D 
} 

唯一の方法は、クラスEでtypealiasを指定することで、プロトコルBでwhere句を使用して、これはtypealiasが不要な重複しているようだ:

protocol B: A where C == D { 

} 

class E: B { 
    typealias C = D 
} 

答えて

2

私は同じ推測しますプロトコル宣言の型制約は、クラスがそのプロトコルに準拠しているときに読み込まれることはありません。 typealiasの畳語を回避するために

、あなたは、プロトコルBから同じ型の制約を削除し、プロトコルB.

上typealiasに
class D { 

} 

protocol A: class { 
    associatedtype C 
} 

protocol B: A { 
} 

extension B { 
    typealias C = D 
} 

class E: B { 
} 
+1

感謝を与えるために拡張機能を使用することができます!この回避策はそれを修正するようです。しかし、私はまだそれをバグと見なして、Swift issue trackerに問題を提出しました。 –

関連する問題