2017-09-29 21 views
1

によって冗長宣言されます。変更可能な一拡張が衝突し、私は2つの異なる拡張子持っているファイル持ってXcodeの

extension MutableCollection where Indices.Iterator.Element == Index { } 
extension Collection where Indices.Iterator.Element == Index {} 

を、私は変更可能です拡張子を持つ(理にかなっています!コレクションには両方のクラスに共通の拡張があります。

問題は、私はスウィフトコンパイラからこの警告が出ている:

冗長同じ型制約 'Self.Index' == 'Self.Indices.Iterator.Element'

どうすべき私はそれを修正するか?

答えて

2

は問題があなたの2つの拡張を使用すると、単一の拡張子を持つ 同じ警告になるだろう、衝突していないことを

extension Collection where Indices.Iterator.Element == Index { } 

短い答えさ:ちょうどあなたの宣言から冗長な制約を削除します。

extension MutableCollection { ... } 
extension Collection { ... } 

説明:スウィフト3は、関連する 種類を制限することはできませんでした。 Indices.Iterator.Element == Indexはすべてのコンクリートのコレクション(配列、ArraySlice、セット、...)のための 満足した場合であっても、 言語がそれを必要としませんでした。そのため、必要に応じて この制約をエクステンションに追加する必要がありました。

スウィフト4では、関連付けられたタイプをwhere 句で拘束できます。SE-0142 Permit where clauses to constrain associated typesを参照してください。

Collectionプロトコルは

associatedtype Indices : Sequence = DefaultIndices<Self> 
     where Self.Index == Self.Indices.Element, ... 

を定義し、Sequenceプロトコルが

associatedtype Element where Self.Element == Self.Iterator.Element 

を定義だから我々は常にアイデンティティ

Indices.Iterator.Element == Indices.Element == Index 

を持っているので、あなたのコードからこれらの制約を削除することができます。

関連する問題