迅速なプロトコル拡張を介して 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 を追加するにはどうすればよいですか?