2016-07-15 3 views
0

私はこのプロトコル定義があります。プロトコルとwhere句を使用してCollectionTypeを拡張する方法

protocol BarChartDataConvertible { 
    var barChartData: BarChartData { get } 
} 

をそして私はそのプロトコルで、要素が特定の型であるCollectionTypeはを延長したいと思います:

extension CollectionType where Generator.Element == DataPoint { 

    // This works, by I also want it to be enforced by the BarChartDataConvertible 
    // var barChartData: BarChartData { ... } 

} 

私はこれをどのように行うことができますか?

[DataPoint(), DataPoint()].barChartData 
+0

もしあなたの質問が* "その要素がPに適合すれば、コレクションをプロトコルPに適合させることはできますか?"と答える:現在、あなたはできません。 –

+0

閉じるが、いいえ。問題は次のとおりです。要素がタイプ・データポイントであり、プロトコルに準拠しているコレクションを拡張できますか?私はより明確にするために質問を編集しました。 – nmdias

+1

「プロトコルに条件付き適合」を宣言することはできません。しかし、拡張で 'var barChartData:BarChartData {return someThingUsefulHere} 'を使用すると、上記のコードをコンパイルする必要があります。 –

答えて

1

あなたは、一般的なプレースホルダ

extension CollectionType where Generator.Element == DataPoint { 
    var barChartData: BarChartData { return somethingUseful } 
} 

、その後

[DataPoint(), DataPoint()].barChartData 

コンパイルの制限 タイプにのみ適用されます拡張メソッドを定義することができます。しかし、あなたは[swift-evolution] [Manifesto] Completing Genericsから始まる

extension CollectionType: DataPoint where Generator.Element == DataPoint { ... } 
このような特徴は、スウィフト進化のメーリングリストで議論されて

、 として、「 プロトコルに条件付き適合」などを宣言することはできません。

*条件不適合

条件付き適合は、一般的なタイプ が特定の状況でのみ特定のプロトコルに準拠するという概念を表しています。 Equatable要素:

拡張アレイ: - 限り私が見ることができるようにEquatable {}

それはスウィフト2で使用できない 例えば、アレイは、その要素がEquatable場合のみEquatableあります - スイフト3の現在の提案リストにはないhttps://github.com/apple/swift-evolutionです。

関連する問題