在Swift的type系统中,如果元素类型符合protocol,我怎么说“anArray<T>conformited to protocolP”?
实际上,我对这个问题更具体的版本感兴趣,其中TQ是相同的协议:您的意思是“如果数组的元素符合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] {
    // ..
}

10-08 05:03