我正在尝试通过 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 的方法
如果我在协议声明前加上@objc
ie ,我可以修复编译器错误
@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?