是否可以使用swift中的反射调用通用对象构造函数?
假设我们有一节课是否可以使用swift中的反射调用通用对象构造函数?,swift,reflection,Swift,Reflection,假设我们有一节课 class Test: NSObject { let batman: String let spiderman: Int let superman: NSObject init(batman: String, spiderman: Int, superman: NSObject) { self.batman = batman self.spiderman = spiderman
class Test: NSObject {
let batman: String
let spiderman: Int
let superman: NSObject
init(batman: String, spiderman: Int, superman: NSObject) {
self.batman = batman
self.spiderman = spiderman
self.superman = superman
}
}
以及初始化的一般方法:
func resolve<T: NSObject>(args: Any...) throws -> T {
// if let object = initWithReflectionSomeHow(T.className, arg1, arg2...) {
// return object
// } else {
// throw exception
// }
}
但不确定如何注入参数。甚至有可能吗?如果您已经可以调用
resolve
,为什么不直接初始化对象?@Sweeper,因为对象可以有resolve
可以处理的其他依赖项。例如,如果要使用依赖于某些服务的viewModel初始化viewController,则解析也会创建这些服务和viewModel,并将它们注入viewController中。否则,您将不得不在需要viewController的任何时候和任何地方手动执行所有这些操作etc@JoakimDanielson是的,我可以从技术上做到这一点,但我正在尝试创建一个基于容器的自定义依赖项注入类,该类利用对象初始化的反射。如果这很明显是可能的。如果在NSObject
子类中有多个init(例如initWithSomething:
initWithSomething2:
),并且具有相同数量的参数,您将如何选择合适的init?如果您已经可以调用resolve
,为什么不直接初始化对象?@Sweeper,因为对象可以有解析的其他依赖项。例如,如果要使用依赖于某些服务的viewModel初始化viewController,则解析也会创建这些服务和viewModel,并将它们注入viewController中。否则,您将不得不在需要viewController的任何时候和任何地方手动执行所有这些操作etc@JoakimDanielson是的,我可以从技术上做到这一点,但我正在尝试创建一个基于容器的自定义依赖项注入类,该类利用对象初始化的反射。如果这很明显是可能的。如果在NSObject
子类中有多个init(例如initWithSomething:
initWithSomething2:
)具有相同数量的参数,您将如何选择合适的init?
func resolve<T: NSObject>() throws -> T {
if let objectClass = NSClassFromString(T.className) as? T.Type {
let object = objectClass.init()
return object
} else {
//throw classNotFoundException
}
}
let obj = try resolve() as Test