2016-12-29 57 views
1

用字符串在Java中创建类实例并不困难,但我对swift很陌生,并且在该语言中做同样的事情对我来说非常困难。从Java到Swift的反思

动机:

我需要调用未知控制器和其知晓的方法(MVC)

的Java

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); 

我在斯威夫特

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到迅速

+0

选择器行实际上不应该导致错误。但第二个错误是合理的,因为你目前只持有类的引用,而不是一个实例。你现在缺少的是相当于'clazz.newInstance()'。 – luk2302

+0

@ luk2302你能举一个例子吗?不幸的是,没有像我在java中发布的那样快速的例子。 – Mystic

+0

都是可以在NSObject的子类中传递的类吗? – luk2302

回答

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]从中你可以选择你的目标控制器。这样你的控制器就可以拥有更复杂的初始化器,并且每个控制器都会有一个管理实例,而不是一遍又一遍地创建它们。

+0

非常感谢! – Mystic