2016-07-15 30 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

关闭,但没有。问题是:我可以扩展一个集合,其中的元素是Type DataPoint,符合协议。我编辑了这个问题以获得更好的解释。 – nmdias

+1

您无法声明“条件符合协议”。但是在扩展中使用'var barChartData:BarChartData {return someThingUsefulHere}',上面的代码应该会被编译。 –

回答

1

您可以定义只适用于有限 型通用占位符

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

然后

[DataPoint(), DataPoint()].barChartData 

编译的扩展方法。但你不能申报了“条件符合 协议”,如

extension CollectionType: DataPoint where Generator.Element == DataPoint { ... } 

的这种特征雨燕演进邮件列表上讨论, 开始[swift-evolution] [Manifesto] Completing Generics

*条件符合,

有条件的一致性表示通用类型 仅在某些情况下才符合特定协议。对于 例如,阵列是Equatable只有当它的元素是Equatable:

扩展阵列:Equatable其中元素:Equatable {}

,但它不提供在夫特2和 - 据我可以看到 - 不在当前的Swift 3提案清单https://github.com/apple/swift-evolution