Swift 1.3中的泛型闭包,允许通过反射调用任意函数。
该项目发布在CocoaPods上,但目前处于无限期暂停状态。它是在Swift 2发布之前编写的,所以可能无法再使用。
Swift不允许使用泛型闭包。具体来说,它不允许使用可变参数的泛型闭包。
换句话说,您可以获取一个具有泛型签名的闭包
func takesAClosure<A, B, C>((A, B) -> C)
但是您无法获取可能有更多或更少参数的闭包
func takesAClosure<A, B, C>(passedClosure: (A, B) -> C)
# This has to be a different function
func takesAClosure<A, C>(passedClosure: (A) -> C)
这个库的目的就是创建一个可以代表任何数量参数的闭包的类型。如果您想要创建一个可以接受任意闭包的库,并且动态地解决和调用它们,这将是一个非常有用的函数。
func TakesAnyFunction<A: AnyFunction>(A)
TakesAnyFunction((a: Int, b: String) in 1 })
TakesAnyFunction((c: Bool) in "1" })
它通过反射传入闭包的类型,将其包装在抽象的 Closure
类中,然后提供一个方法 call
,该方法接受一个参数数组。如果参数的数量和类型与传入闭包的签名匹配,则调用原始闭包并返回结果。
import AnyFunction
let c = Closure.wrap { (a: String) in a }
let ret = try! c.call(["Test"])
print(ret) // #=> "Test"