Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 基于参数列表/返回类型将闭包参数化为泛型_Swift_Generics - Fatal编程技术网

Swift 基于参数列表/返回类型将闭包参数化为泛型

Swift 基于参数列表/返回类型将闭包参数化为泛型,swift,generics,Swift,Generics,有没有一种方法可以为闭包生成一个泛型类型签名,以便我以后可以泛型地调用它?特别是我的问题是如何处理数量未知的论点 我有一个对象,我希望在更新时调用一系列闭包,我希望其他对象能够注册它们希望用第一个对象调用的闭包 闭包是不可散列的,但我也希望能够注销闭包,因此我创建了一个自定义类型,以基于字典处理此问题: //T is the block signature such as Double->() struct ClosureCollection<T> : SequenceType

有没有一种方法可以为闭包生成一个泛型类型签名,以便我以后可以泛型地调用它?特别是我的问题是如何处理数量未知的论点

我有一个对象,我希望在更新时调用一系列闭包,我希望其他对象能够注册它们希望用第一个对象调用的闭包

闭包是不可散列的,但我也希望能够注销闭包,因此我创建了一个自定义类型,以基于字典处理此问题:

//T is the block signature such as Double->()
struct ClosureCollection<T> : SequenceType {
    private var idx=0
    var closureDict:[Int:(T,NSOperationQueue)]=[:]


    mutating func addClosure(b:T) -> Int {
        return addClosure(NSOperationQueue.mainQueue(),b)
    }

    mutating func addClosure(q:NSOperationQueue, _ b:T) -> Int {
        closureDict[idx]=(b,q)
        idx+=1
        return idx-1
    }

    mutating func dropClosure(k:Int) {
        closureDict.removeValueForKey(k)
    }

    func generate() -> AnyGenerator<(T,NSOperationQueue)> {
        var dgen=closureDict.generate()
        return AnyGenerator {
            return dgen.next()?.1
        }
    }
}
到目前为止,一切都很好,但它要求调用方遵循一个非常特定的模式来使用我想要隐藏的集合。我想将这个想法扩展到我可以要求集合使用如下语法运行for循环本身的地方

distributionPoints.runAllWith(dm,error)
问题在于runAllWith签名——我当前的实现比完整闭包签名更通用,因为我不知道如何使闭包的参数数量通用。如果我知道块接受一个参数并返回一个参数,例如,通过使用两个类型占位符,例如T表示参数,U表示返回值,我怀疑这是可以做到的

我似乎无法在未知数量的参数中实现通用性。我正在创建的类型不关心块的结构是什么,它只想接受具有特定签名的闭包,然后提供一种机制,通过公开依赖于闭包签名的API来调用它们

我认为不支持可变的通用参数,所以我不能走这条路。元组splat已被弃用

有没有一种方法可以做到这一点,而不需要调用方将参数捆绑到一个元组中,然后在每个闭包周围使用一个包装器来打开一个参数元组并进行手工制作的元组splat

for (p,q) in distributionPoints {
    q.addOperationWithBlock {p(dm,error)}
}
distributionPoints.runAllWith(dm,error)