从Objective-C代码调用class_respondsToSelector获取Swift类方法

时间:2016-12-14 11:33:27

标签: ios objective-c swift

我有一个Swift课程,如下所示

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)在我ViewControllerlet responds = self.responds(to: Selector("helloWorld:"))时,它会返回true

2)在AppDelegete撰写let responds = ViewController.responds(to: Selector("helloWorld:"))时,它会返回false

3)在我AppDelegetelet responds = ViewController.instancesRespond(to: Selector("helloWorld:"))时,它会返回false

以上所有内容都会返回NO。应该怎么做才能解决这个问题或错误是什么?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

在Swift 3中,第一个参数标签是方法签名的一部分,当生成Objective-C选择器时,它与"和"连接,因此,{{1}的默认Objective-C选择器}变成func helloWorld(a: String)

如果您不喜欢这种行为,可以将helloWorldWithA:写为helloWorld,其Objective-C选择器变为func helloWorld(_ a: String)

或者您可以使用helloWorld:注释明确指定Objective-C选择器。 像@objc这样的写作,它的Objective-C选择器变为@objc(helloWorld:) func helloWorld(a: String)指定。

答案 1 :(得分:0)

我能想到的一些建议:

  • 注释你的类,`@ objc(ViewController),以确保它以正确的名称公开
  • 使用参数名称限定您的选择器,即helloWorld(a:)