Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从Objective-C代码为Swift类方法调用类_respondsToSelector_Ios_Objective C_Swift - Fatal编程技术网

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中,默认情况下忽略第一个参数的标签。