gpt4 book ai didi

swift - 使用反射调用方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:01 24 4
gpt4 key购买 nike

据我所知,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")

使用它的好处在于您根本不需要使用强制转换,而且使用错误的参数调用方法会触发编译时错误

关于swift - 使用反射调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30974805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com