AnyFunction 1.0.4

AnyFunction 1.0.4

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布Aug 2017
SwiftSwift版本3.0
SPM支持SPM

Damouse维护。



  • Mickey Barboi

AnyFunction

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"