在Swift的type系统中,如果元素类型符合protocol,我怎么说“anArray<T>
conformited to protocolP
”?
实际上,我对这个问题更具体的版本感兴趣,其中T
和Q
是相同的协议:您的意思是“如果数组的元素符合P
,那么数组就是符合的”。这是我到目前为止所拥有的。(我正在尝试一个简单的快速检查库,从可以随机生成的标记类型开始。)
protocol Arbitrary {
class func arbitrary() -> Self
}
extension Array {
static func arbitrary<T where T : Arbitrary>() -> [T] {
// code to create a random-length list of T objects
// using T.arbitrary() for each one
}
}
extension Array<T where T : Arbitrary> : Arbitrary {}
这个失败了
extension of generic type 'Array' cannot add requirements
extension Array<T where T : Arbitrary> : Arbitrary {}
最佳答案
不能在swift中这样做,因为不能进一步约束泛型类型。例如,不能向仅在Array<T>
为T
时才有效的Comparable
添加方法-这就是为什么有如此多的全局函数用于处理泛型类型(map、filter、sort等)。
从最近在dev论坛上发布的chris lattner的帖子来看,这听起来像是快速开发人员朝着这个方向前进,但目前还远未达到这个目标。查看您是否可以实现将T
约束为Arbitrary
的全局函数:
func arbitrary<T: Arbitrary>() -> [T] {
// ..
}