Swift 4 添加手势:覆盖 vs @objc

Posted

技术标签:

【中文标题】Swift 4 添加手势:覆盖 vs @objc【英文标题】:Swift 4 add gesture: override vs @objc 【发布时间】:2017-07-02 02:46:08 【问题描述】:

我希望在我的视图中添加如下手势:

    override func viewDidLoad() 
    super.viewDidLoad()

    < blah blah blah >

    // Add tap gesture
    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    myView.addGestureRecognizer(tap)

但是,在 Swift 4 中,我的编译器给了我以下错误:

Argument of '#selector' refers to instance method 'handleTap()' that is not exposed to Objective-C

建议添加@objc 以将此实例方法公开给Objective-C。

实现此功能的另一个选项(仅通过代码)是覆盖 touchesBegan() 函数并使用它来处理点击。

我试图以“Swift”的方式做到这一点,而不必引入 Obj-C。有没有一种纯粹的 Swift 方法可以在不使用 @objc 的情况下添加这个轻击手势?或者这是添加此点击手势的正常和预期方式?

【问题讨论】:

How can I deal with @objc inference deprecation with #selector() in Swift 4?的可能重复 【参考方案1】:

在这里使用@objc 是正常和预期的方式。

底层手势识别器代码是用 Objective-C 编写的,因此您需要让选择器可以从 Objective-C 调用,这就是 @objc 所做的一切。

您的替代技术仍在使用 Objective C-API,但在没有选择器的情况下与它们进行交互,因此它不太明显。

【讨论】:

好答案 ;) 我只想补充一点,此更改是由 Swift 4 中的 Limiting @objc inference proposal 实现的。

以上是关于Swift 4 添加手势:覆盖 vs @objc的主要内容,如果未能解决你的问题,请参考以下文章

用 Swift 中使用的 ObjC 编写的消除歧义覆盖方法

将手势识别器添加到SKShapeNode Swift 4

UIWebView添加手势VS设置背景色

覆盖在swift中的扩展对象内不起作用

覆盖在swift中的扩展对象内不起作用

我们可以为返回可选值的 swift 函数添加 @objc 吗?