Ios 从Objective-C代码为Swift类方法调用类_respondsToSelector
我有一门速成课,如下所示Ios 从Objective-C代码为Swift类方法调用类_respondsToSelector,ios,objective-c,swift,Ios,Objective C,Swift,我有一门速成课,如下所示 class ViewController: UIViewController { func helloWorld(a: String) { print(a); } } 假设我的目标名称是objective-c类中的Pebble,我需要找出该类ViewController是否响应选择器helloWorld:。我尝试了以下陈述: class_respondsToSelector(NSClassFromString(@"Pebble.
class ViewController: UIViewController {
func helloWorld(a: String)
{
print(a);
}
}
假设我的目标名称是objective-c类中的Pebble
,我需要找出该类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
中,当我写入时,让responses=self.responses(to:Selector(“helloWorld:”)
-它返回true
2) 在AppDelegete
中,当我写入let responses=ViewController.responses(to:Selector(“helloWorld:”)
-它返回false
3) 在AppDelegete
中,当我写入let responses=ViewController.instancessponse(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(u.a:String)
,其Objective-C选择器变为helloWorld:
或者可以使用@objc
注释显式指定Objective-C选择器。
像
@objc(helloWorld:)func-helloWorld(a:String)
那样编写,它的Objective-C选择器变成指定的helloWorld:
。我可以想到一些建议:
- 注释您的类,`@objc(ViewController),以确保它以正确的名称公开
- 使用参数名称限定选择器,即
helloWorld(a:)
helloWorld(a:String b:String)
(即多个参数)时,ObjC等价物的外观如何。Swift 2.3中的行为是否不同?“在生成Objective-C选择器时,它与“with”“-有趣@prabodhprakash,它变成了helloWorldWithA:b:
,有两个参数的Objective-C选择器有两个冒号。Swift 2.3中的行为是一样的吗?@prabodhprakash,我不能用2.3测试,但在Swift 2.3中应该是helloWorld:b:
。在Swift 2中,默认情况下忽略第一个参数的标签。