我有一个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
。应该怎么做才能解决这个问题或错误是什么?
答案 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)
我能想到的一些建议:
helloWorld(a:)