使用反射调用方法
Calling Method using reflection
据我所知,Swift 中的反射目前还很少可用。为了性能,我目前正在将 objective-c 代码转换为 swift(我注意到了相当大的差异)。
现在我需要的是一种使用反射调用方法的方法。需要调用该方法的对象扩展 NSObject
以启用 class 使用以下代码解析;
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!);
但是我如何use/call referenceToMethod
?
额外
我也试过调用 performSelector 但这已被完全删除 Swift 2. 我也想阻止使用任何 @objc
attributes/annotations.
如果您正在寻找一种完全 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")
使用它的优势在于您根本不需要使用强制转换,而且使用错误参数调用方法会触发编译时错误
一个疯狂的想法,并不完美:
您可以将变量定义为:
var myFunctionToBe : (() -> AnyObject)?
甚至将 AnyObject 设置为参数,
然后在启动器中:
init() {
myFunctionToBe = {
//do something
return whatsdone
}
}
然后在反射中你可以看到 var myFunctionToBe,将其获取为:
let method = c.value as? (() -> AnyObject)
并调用它:
method!()
或
let returnVal = method!() as? String
据我所知,Swift 中的反射目前还很少可用。为了性能,我目前正在将 objective-c 代码转换为 swift(我注意到了相当大的差异)。
现在我需要的是一种使用反射调用方法的方法。需要调用该方法的对象扩展 NSObject
以启用 class 使用以下代码解析;
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!);
但是我如何use/call referenceToMethod
?
额外
我也试过调用 performSelector 但这已被完全删除 Swift 2. 我也想阻止使用任何 @objc
attributes/annotations.
如果您正在寻找一种完全 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")
使用它的优势在于您根本不需要使用强制转换,而且使用错误参数调用方法会触发编译时错误
一个疯狂的想法,并不完美:
您可以将变量定义为:
var myFunctionToBe : (() -> AnyObject)?
甚至将 AnyObject 设置为参数, 然后在启动器中:
init() {
myFunctionToBe = {
//do something
return whatsdone
}
}
然后在反射中你可以看到 var myFunctionToBe,将其获取为:
let method = c.value as? (() -> AnyObject)
并调用它:
method!()
或
let returnVal = method!() as? String