0

迅速なプロトコル拡張を介して 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 で「タイプ SomeViewController がプロトコル 'Tapable' に準拠していません」というコンパイラ エラーが発生します。また、「候補は @objc ではありませんが、プロトコルにはそれが必要です」という修正も提案されています。

この Fix-it をタップすると、setupTapGestureRecognizer の先頭に @objc が追加されます (つまり@objc func setupTapGestureRecognizerInView(view: UIView) {、これではコンパイラ エラーは解決されず、Fix-it が追加したばかりの @objc を削除するように指示する 2 番目のコンパイラ エラーも発生します)。

UIViewController のプロトコル拡張を介して #selector を追加するにはどうすればよいですか?

4

0 に答える 0