从Java到Swift的反思

时间:2016-12-29 15:08:39

标签: java swift

用字符串在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做同样的事情

1 个答案:

答案 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]的地图/字典,您就可以选择目标控制器,这样可以使事情变得更加容易并且类型更安全。这样,您的控制器可以拥有更复杂的初始化程序,您将拥有一个托管实例,而不是一次又一次地创建它们。