使用任意参数快速执行任意闭包类型

时间:2016-11-23 03:00:37

标签: ios swift functional-programming closures

我想构建一个管理器工具,当给定一个与参数列表匹配的元组时,它可以执行一组相同类型的闭包,但是我在修改Swift的类型系统时遇到了麻烦。

一般的想法是,我希望能够从任何类请求资源(带有完成块),并且只需要一次请求资源,并在获得响应时调用每个完成块。我已经将它原型化了一次并且效果很好,看起来像这样:

class ResourceGetter {
    var completionQueue: [((Resource) -> Void)]?
    func getResource(withCompletion completion:((Resource) -> Void)) {
        guard completionQueue == nil else {
            completionQueue!.append(completion)
            return
        }
        ClassThatActuallyGetsIt.getResource(completion: { (res: Resource) -> Void in
            completionQueue.forEach { $0(res) }
            completionQueue = nil
        }
    }
}

并且任何类都可以调用ResourceGetter.getResource,并且当资源实际可用时将处理它们的闭包。

现在我想在应用程序的几个不同位置使用此功能,但我不想在completionQueue中为可能需要的每个资源编写,所以我想弄清楚如何通用化(我不知道是否有这个词)这个功能。

我的梦想是看它并像这样使用:

class CompletionHolder {
    var completionDict: [String : [((ArbitraryTuple) -> Void)]] = [:]
    func execClosures(forKey key: String, parameters: ArbitraryTuple) {
        completionDict[key].forEach { $0(parameters) }
    }
}

class ResourceGetter {
    func getResource(withCompletion completion:((Resource) -> Void)) {
        CompletionHolder.completionDict["Resource"].append(completion)
        ClassThatActuallyGetsIt.getResource(completion: { (res: Resource) -> Void in
            CompletionHolder.execClosures(forKey: "Resource", parameters: (Resource))
        }
    }
}

我怎样才能实现这一目标?

0 个答案:

没有答案