2016-12-29 63 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