加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Swift想要将#selector的参数暴露给Objective-C

发布时间:2020-12-15 02:01:29 所属栏目:百科 来源:网络整理
导读:我有一个Swift项目,我想附加一个方法到UIButton的水龙头事件。我有以下代码: class MyClass { let myButton = UIButton(frame: CGRectMake(50,50,100,50)) init() { myButton.addTarget(self,#selector(self.didTap(_:)),forControlEvents: .TouchUpInside
我有一个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: 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:”)可以正常工作。

解决方法

选择器是Objective-C的一个特性,只能用于暴露于动态Obj-C运行时的方法。您不能使用纯Swift方法的选择器。

如果你的类继承自NSObject,那么它的公共方法会自动暴露给Obj-C。由于您的类不继承NSObject,您必须使用@objc属性来表示您希望将此方法暴露于Obj-C,以便可以使用Obj-C选择器调用该方法。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读