我有一个如下所示的 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/