在Swift中动态调用函数

时间:2015-07-29 23:24:41

标签: swift reflection performselector nsinvocation

我正在尝试在Swift中实现路由器模式,但无法弄清楚如何动态调用方法。

例如,有一组参数:

let arguments: [Any] = [100, 0.5, "Test"]

需要调用的处理程序:

public class MyClass {
    public func handler(value1: Int, value2: Double, text: String) {
        print("int=\(value1), double=\(value2), string=\(text)")
    }
}
let myClass = MyClass()

路由器有一个无类型的函数引用,它将用作回调函数:

let callback: Any = myClass.handler

如何将上面数组中的参数映射到函数参数?

我发现处理程序的参数类型可以通过反射获得:

reflect(myClass.handler).valueType // upd: or myClass.handler.dynamicType
is
(Swift.Int, Swift.Double, Swift.String) -> ()

我不知道如何迭代参数类型,甚至不知道如何计算。可能我可以将其解析为字符串然后使用NSInvocation来调用该方法。由于NSInvocation在Swift中不可用,因此需要使用Objective C辅助函数。另一个缺点是它不适用于全局函数和闭包。

非常欢迎任何其他想法。

0 个答案:

没有答案