如何使用协议和where子句扩展CollectionType?
问题描述:
我有这个协议定义:如何使用协议和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
答
您可以定义只适用于有限 型通用占位符
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。
如果你的问题是“我可以使一个集合符合协议P,如果它的元素符合P”*那么答案是:目前,你不能。 –
关闭,但没有。问题是:我可以扩展一个集合,其中的元素是Type DataPoint,符合协议。我编辑了这个问题以获得更好的解释。 – nmdias
您无法声明“条件符合协议”。但是在扩展中使用'var barChartData:BarChartData {return someThingUsefulHere}',上面的代码应该会被编译。 –