2016-12-29 17 views
1

Javaのクラスインスタンスを文字列から作成することは難しくありませんが、私は迅速で新しいことで、その言語で同じことを私にとっては非常に難しくしています。JavaからSwiftへのリフレクション

MOTIVATION:私は未知のコントローラーとその未知の方法(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) 
} 
での私の試み

にはどうすれば迅速

+0

セレクタ行は実際にエラーを起こすべきではありません。しかし、インスタンスではなくクラス参照のみを保持しているので、2番目のエラーは正当です。現在欠けているのは 'clazz.newInstance()'と同じです。 – luk2302

+0

@ luk2302あなたは例を投稿できますか?残念ながら、私がjavaに投稿したような迅速な例はありません。 – Mystic

+0

はNSObjectのサブクラスで渡すことができるすべてのクラスですか? – luk2302

答えて

2

に、Javaから同じことを行うことができますあなたのために働くかもしれない次:それはおそらく非常に簡単なものを作り、単にマップを持っているより安全に入力することを

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") 
} 

注意/ dictionary of [String:ControllerInstances]から、ターゲットコントローラを選択することができます。そうすれば、コントローラはより複雑な初期化子を持つことができ、それぞれを管理するインスタンスを1つずつ持ち、繰り返し作成することはありません。

+0

ありがとうございました! – Mystic

関連する問題