据我了解,Swift 中的反射目前还不太可用。为了提高性能,我目前正在将 Objective-C 代码转换为 Swift(我注意到有很大的差异)。
现在我需要的是一种使用反射调用方法的方法。需要调用该方法的对象扩展NSObject
使用以下代码可以解析该类;
let clazz = NSClassFromString("MyProject.DynamicClass") as NSObject.Type;
let clazzInstance = clazz() as! NSObject;
我可以使用以下代码检索参数的数量和对该方法的引用;
let selectorMethod = Selector("myCustomMethod:");
let numberOfArguments : UInt32 = method_getNumberOfArguments(selectorMethod);
let referenceToMethod : Method = class_getInstanceMethod(clazz, selector!);
但是我如何使用/调用referenceToMethod
?
额外的
我也尝试过调用performSelector,但这已被完全删除Swift 2。我还想阻止使用任何@objc
属性/注释。
如果您正在寻找一种完全 Swifty 的反射方式,那么具有需要调用的方法的对象根本不需要是 NSObject,而是需要一个必需的初始化程序。看看下面的例子:
class A {
required init() {}
func printSomething(s: String) {
print(s)
}
}
// initializing object dynamically from class
let clazz = NSClassFromString("MyProject.A") as! A.Type
let clazzInstance = clazz()
// getting and calling its methods in Swifty way
let method = clazzInstance.printSomething
method("something")
使用它的优点在于,您根本不需要使用强制转换,并且使用错误的参数调用方法会触发编译时错误
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)