2017-01-23 11 views
2

objcランタイムを使用してNSObjectから継承するSwiftクラスを動的にロードしようとしています。objc_getClass:NSObjectを継承するswiftクラスをロードする

@objc属性は、あなたのスウィフトAPIを利用できるようになり、Appleのドキュメントによると

@objc public class TestClass : NSObject { 

    @objc public func testMethod() -> String { 
     return "String" 
    } 

} 

マイスウィフトクラス(私はにObjCから、ではないスウィフトからクラスをロードしようとしています) Objective-CおよびObjective-Cランタイムで

しかし、objc_getClass("TestClass")の結果はです3210。

何か間違っていますか?または、objcランタイムを使用してObjCクラスを継承する迅速なクラスをロードすることはまったく不可能ですか?

答えて

3

を使用して背後で使用される名前を正確に確認することができるだけでなく、@objc含ま:

@objc(TestClass) public class TestClass : NSObject { 

    @objc public func testMethod() -> String { 
     return "String" 
    } 

} 

NSClassFromString("TestClass") // TestClass.Type 

objc_getClass("TestClass") // TestClass 

そうでなければ、あなたのクラスはできませんObjective-Cランタイムに登録され、objc_getClassまたはNSClassFromStringのような呼び出しはnilを返します。

+1

実際に 'print(TestClass.className())'(Objective-Cの名前を指定しない)を実行すると、 'objc_class_name.TestClass 'が出力されます。これは' objc_getClass'で使用できます。したがって、ランタイムに登録されています。接頭辞付きの名前だけです。 – Hamish

+0

@ハミッシュ・オー私はそれを知らなかった。ありがとう!私は私の答えを編集します。 – JAL

+0

@Hamish Hmm、 'TestClass.className()'は私のためにコンパイルされません(Swift 3)。 – JAL

2

objc_getClass("YourAppName.TestClass")をお試しになるとどうなりますか?ほとんどの場合、モジュール名の先頭に追加されます。あなたがあなたのクラスのためのObjective-Cの名前を指定する必要がNSStringFromClass([TestClass class])

+3

この特定のケースでは名前空間の衝突は問題ではありませんが、良い推測です。 – JAL

関連する問題