ios - 从 Objective-C 代码为 Swift 类方法调用 class_respondsToSelector

标签 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) 在 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。应该如何解决这个问题或错误是什么?

最佳答案

试试这个:

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

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

如果你不喜欢这种行为,你可以把你的helloWorld写成func helloWorld(_ a: String),它的Objective-C选择器变成 Hello World :

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

关于ios - 从 Objective-C 代码为 Swift 类方法调用 class_respondsToSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41141543/

相关文章:

ios - 如何在 Swift 中为 iOS 创建框架/库,以用于其他项目?

python - NSTextView 突出显示不触发

swift - SWXMLHash 解析数据对象

ios - 当我按下按钮时,我的游戏崩溃(因 NSException 类型的未捕获异常而终止)

ios - 如何快速在 VLC 播放器上方添加全屏按钮

ios - 苹果 TestFlight : Is it allowed to upload 2 beta apps for an A/B test?

iphone - self.property 和 property 的用法有什么区别

ios - 为什么我的 UIView 的一部分覆盖了键盘?

ios - 将 JSOn 绘制到 UITableviewCell 时出错

ios - 单击移动 SKSpriteNode,但长按时连续移动 - Sprite Kit