用字符串在Java中创建类实例并不困难,但我是新手快速并且用这种语言做同样的事情对我来说非常困难。
动机:
我需要调用未知控制器及其未知方法(MVC)
爪哇
String className = "MyClass";
String methodName = "MyMethod"; // with one argument like (String[] args) and return String
// in swift can be a Dictionary
String[] argument = new String[] {"A", "B"}
Class<?> clazz = Class.forName(className);
Object instance = clazz.newInstance();
Method method = clazz.getDeclaredMethod(methodName, Class<?>[]);
Object returnStringObject = method.invoke(instance, argument);
我在 Swift
中的尝试let clazz: AnyClass? = NSClassFromString(className)
if clazz != nil {
// ERRORRRRRR (use of unresolved identifier NSSelectorFromString)
let selector: Selector = NSSelectorFromString(methodName)
// ERRORRRRRR (cannot invoke performeSelector with an argument list of type selector)
clazz?.performSelector(selector)
}
如何从Java到swift做同样的事情
答案 0 :(得分:2)
以下内容可能适合您:
let cla = NSClassFromString(className)
if let cla = cla as? NSObject.Type {
let selector: Selector = NSSelectorFromString(methodName)
let instance = cla.init()
if (instance.responds(to: selector)) {
print(instance.perform(selector))
} else {
print("method not found")
}
} else {
print("class not found")
}
请注意,只需拥有一个[String:ControllerInstances]
的地图/字典,您就可以选择目标控制器,这样可以使事情变得更加容易并且类型更安全。这样,您的控制器可以拥有更复杂的初始化程序,您将拥有一个托管实例,而不是一次又一次地创建它们。