Ios 斯威夫特希望#选择器的参数暴露于Objective-C
我有一个Swift项目,我想将一个方法附加到UIButton的点击事件。我有以下代码:Ios 斯威夫特希望#选择器的参数暴露于Objective-C,ios,objective-c,xcode,swift,Ios,Objective C,Xcode,Swift,我有一个Swift项目,我想将一个方法附加到UIButton的点击事件。我有以下代码: class MyClass { let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50)) init() { myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside) } func didTap(sender:
class MyClass {
let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50))
init() {
myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside)
}
func didTap(sender: UIButton) {
print("Tapped")
}
}
XCode突出显示我的addTarget
行,并显示:
Argument of '#selector' refers to a method that is not exposed to Objective-C
如果我将@objc
前缀添加到我的func-didTap
中,就像它所建议的那样,那么一切正常
我的构建设置中是否启用了导致这种奇怪行为的东西
另外,我在7.3.1中得到了这种行为。但是,如果我在7.2.1中尝试这一点,它不接受#选择器(方法(:)
语法,选择器(“方法”)
工作正常
如果我像建议的那样在funcdidTap
中添加@objc前缀,那么一切正常
我的构建设置中是否启用了导致这种奇怪行为的东西
不,你看到的是正常的。选择器是Objective-C特性,使用选择器向类实例发送消息也是如此。Objective-C发送该消息的唯一方式是它是否可以看到您的类或方法本身。MyClass本身不是从NSObject派生的,所以Objective-C无法看到它。因此,如果您不想从NSObject派生它,您至少必须通过使用@objc
标记将该方法公开给Objective-C
选择器(“方法:”)工作正常
在Swift的早期版本中,编译器在这种情况下不会帮助您,因此您的代码将被编译。但是当消息到达并且Objective-C找不到方法时,您就会崩溃。
#选择器
语法的全部要点是帮助您避免崩溃。这就是它所做的 选择器是Objective-C的一项功能,只能与暴露于动态Obj-C运行时的方法一起使用。不能将选择器设置为纯Swift方法
如果您的类继承自NSObject
,那么它的公共方法将自动公开给Obj-C。由于您的类不是从NSObject
继承的,因此必须使用@objc
属性来指示您希望将此方法公开给Obj-C,以便可以使用Obj-C选择器调用它
#selector()
是Swift 2.2中的新语法。它允许编译器检查您试图使用的选择器是否确实存在。旧语法已弃用,将在Swift 3.0中删除。您必须从NSObject