0

我正在尝试通过 swift 协议扩展将 UITapGestureRecognizer 添加到 UIViewController 。当我尝试使用#selector 初始化tapGestureRecognizer 时遇到问题。我在操场上设置了以下内容

protocol Tapable {
    func setupTapGestureRecognizerInView(view: UIView)
    func didTap(sender: UITapGestureRecognizer)
}

extension Tapable where Self: UIViewController {
    func setupTapGestureRecognizerInView(view: UIView) {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.didTap(_:)))
        tapGesture.numberOfTapsRequired = 1
        view.addGestureRecognizer(tapGesture)
    }

    func didTap(sender: UITapGestureRecognizer) {
    }
}

class SomeViewController: UIViewController, Tapable {

}

在上述场景中,我收到编译器错误消息“#selector 的参数指的是未公开给 Objective-C 的方法

如果我在协议声明前加上@objcie ,我可以修复编译器错误

@objc protocol Tapable {
    func setupTapGestureRecognizerInView(view: UIView)
    func didTap(sender: UITapGestureRecognizer)
}

但是,如果我添加@objc,我会在 UIViewController 中得到一个编译器错误,说“Type SomeViewController 不符合协议'Tapable'”。它还建议进行修复“候选人不是@objc,但协议需要它”。

点击这个 Fix-it 会在 setupTapGestureRecognizer 前面加上 @objc 在扩展名中(即@objc func setupTapGestureRecognizerInView(view: UIView) {,但这并不能解决编译器错误,还会导致第二个编译器错误,告诉我删除 Fix-it 刚刚添加的 @objc

如何通过 UIViewController 的协议扩展添加#selector?

4

0 回答 0