如何使用Protocol和where子句扩展CollectionType?

时间:2016-07-15 11:24:18

标签: swift swift2

我有这个协议定义:

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

1 个答案:

答案 0 :(得分:1)

您可以定义仅适用于受限制的扩展方法 通用占位符的类型

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

然后

[DataPoint(), DataPoint()].barChartData

编译。但是你不能宣布一个"条件一致性 协议",例如

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

这个功能在Swift Evolution邮件列表中讨论, 从[swift-evolution] [Manifesto] Completing Generics开始:

  

*条件一致性

     

条件一致性表达了泛型类型的概念   仅在某些情况下符合特定协议。对于   例如,只有当Array的元素是Equatable时,Array才是Equatable:

     

extension Array:Equatable where Element:Equatable {}

但它在Swift 2中不可用 - 据我所见 - 而不是https://github.com/apple/swift-evolution上当前的Swift 3提案列表。