2016-12-14 4 views
1

からスウィフトクラスメソッドのためclass_respondsToSelectorを呼び出して、私はObjective-Cのコード

場合は、Objective-Cのクラスから、私が見つける必要があり、私のターゲット名が Pebbleであると仮定すると、
class ViewController: UIViewController { 
    func helloWorld(a: String) 
    { 
     print(a); 
    } 
} 

以下のようスウィフトクラスを持っていますViewControllerクラスはセレクタhelloWorld:に応答します。それはtrueを返します - 私はlet responds = self.responds(to: Selector("helloWorld:"))を書くときViewControllerで)、しかし

1を

class_respondsToSelector(NSClassFromString(@"Pebble.ViewController"), NSSelectorFromString(@"helloWorld")) 
class_respondsToSelector(NSClassFromString(@"Pebble.ViewController"), NSSelectorFromString(@"helloWorld:")) 
class_respondsToSelector(NSClassFromString(@"ViewController"), NSSelectorFromString(@"helloWorld:")); 
class_respondsToSelector(NSClassFromString(@"ViewController"), NSSelectorFromString(@"helloWorld")); 

:私は、次のステートメントを試してみました。

2)AppDelegeteの場合、let responds = ViewController.responds(to: Selector("helloWorld:"))と書くと、falseを返します。

3)let responds = ViewController.instancesRespond(to: Selector("helloWorld:"))と書くとAppDelegeteに - falseを返します。

上記はすべてNOです。これを修正するためには何をすべきか、あるいはエラーは何ですか?

答えて

1

は、これを試してください:スウィフト3において

class_respondsToSelector(NSClassFromString(@"{YOUR_MODULE_PRODUCT_NAME}.ViewController"), NSSelectorFromString(@"helloWorldWithA:")) 

を、最初の引数ラベルは、メソッドシグネチャの一部であり、Objective-Cのセレクタを生成するときには「で」で連結されているので、デフォルトのObjective-C func helloWorld(a: String)のセレクタはhelloWorldWithA:になります。

この動作が気に入らない場合は、helloWorldfunc helloWorld(_ a: String)と書くことができ、そのObjective-CセレクタはhelloWorld:になります。

また、@objc注釈でObjective-Cセレクタを明示的に指定することもできます。 @objc(helloWorld:) func helloWorld(a: String)のように書くと、Objective-Cセレクタは指定された通りになります。

+0

これは機能します。関数が 'helloWorld(a:String b:String)'(つまり複数のパラメータ)のようなものである場合、ObjCの同等物はどのように見えますか? Swift 2.3ではその動作が異なりますか? – prabodhprakash

+0

"Objective-Cセレクタを生成するとき、" With "と連結されます - 面白い! – Andreas

+0

@prabodhprakash、それは 'helloWorldWithA:b:'となり、2つの引数を持つObjective-Cセレクタは2つのコロンを持ちます。 – OOPer

0

私は考えることができるいくつかの提案:

  • はすなわち、パラメータ名を使用してセレクタを修飾してくださいそれが適切な名前で公開されていることを確認するために
  • 、 `@objc(ViewControllerを)、あなたのクラスに注釈を付けますhelloWorld(a:)
関連する問題