一尘不染

Swift希望将#selector的参数公开给Objective-C

swift

我有一个Swift项目,我想在其中将方法附加到UIButton的tap事件。我有以下代码:

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建议添加前缀,则说明一切正常。

我的构建设置中是否启用了某些导致这种奇怪行为的功能?

PS。我在7.3.1中得到了这种行为。但是,如果我在7.2.1中尝试此方法,则它不接受#selector(method(_:))语法,并且Selector("method:")工作正常。


阅读 296

收藏
2020-07-07

共1个答案

一尘不染

选择器是Objective-C的功能,只能与动态Obj-C运行时公开的方法一起使用。您不能为纯Swift方法选择器。

如果您的类继承自该类,NSObject则其公共方法将自动暴露给Obj-C。由于您的类没有继承自您的类,因此NSObject您必须使用@objc属性来指示您希望将此方法公开给Obj-C,以便可以使用Obj-
C选择器对其进行调用。

#selector()是Swift 2.2中的新语法。它允许编译器检查您要使用的选择器是否确实存在。旧的语法已被弃用,并将在Swift 3.0中删除。

2020-07-07