2016-12-14 47 views
1

我有一個雨燕類,如下呼籲class_respondsToSelector從Objective-C代碼迅捷的類方法

class ViewController: UIViewController { 
    func helloWorld(a: String) 
    { 
     print(a); 
    } 
} 

假設我的目標名稱爲Pebble,從Objective-C類,我需要了解,如果類ViewController對選擇器helloWorld:作出響應。我曾嘗試以下語句:

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

然而,

1)在ViewController當我寫let responds = self.responds(to: Selector("helloWorld:")) - 它返回true

2)AppDelegete當我寫let responds = ViewController.responds(to: Selector("helloWorld:")) - 它返回false

3)AppDelegete當我寫let responds = ViewController.instancesRespond(to: Selector("helloWorld:")) - 它返回false

以上全部返回NO。應該做些什麼來解決這個問題或錯誤是什麼?

回答

1

嘗試這種情況:

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

在夫特3,第一個參數標記是方法簽名的一部分,並且產生目標C選擇器,當它的值與「與」,因此,默認的目標C func helloWorld(a: String)的選擇器變爲helloWorldWithA:

如果你不喜歡這種行爲,你可以寫你的helloWorldfunc helloWorld(_ a: String),其Objective-C選擇器變爲helloWorld:

或者您也可以使用@objc註釋明確指定Objective-C選擇器。 如@objc(helloWorld:) func helloWorld(a: String)這樣寫,它的Objective-C選擇器變爲helloWorld:

+0

這個工程。當函數類似於'helloWorld(a:String b:String)'(即多個參數)時,ObjC等價物將如何看待。 Swift 2.3中的行爲有何不同? – prabodhprakash

+0

「當生成Objective-C選擇器時,它與」With「連接在一起 - 」 - 有趣! – Andreas

+0

@prabodhprakash,它變成'helloWorldWithA:b:',具有兩個參數的Objective-C選擇器有兩個冒號。 – OOPer

0

我能想到的一些建議:

  • 註釋類,`@objc(視圖控制器),以確保它被暴露恰當名字
  • 與參數名稱,即你的資格選擇helloWorld(a:)