Swift 中的手动 GestureRecognizer 处理程序不能有参数?

Manual GestureRecognizer handler in Swift can't have arguments?

如果我通过 InterfaceBuilder 创建一个 GestureRecognizer 处理程序,我得到一个如下所示的方法:

    @IBAction func Tap(tap: UITapGestureRecognizer) {
      var touchLocation = tap.locationInView(self.view)
      imageView.transform.tx = touchLocation.x
      imageView.transform.ty = touchLocation.y
    }
    //works great

如果我手动创建一个 GestureRecognizer,我必须创建一个没有参数的函数,如下所示:

    let tap = UITapGestureRecognizer()

    override func viewDidLoad() {
      super.viewDidLoad()

      let imageSize = CGSize(width: 100, height: 100)
      var iView = UIImageView(frame: CGRect(origin: CGPoint(x: 100, y: 100), size: imageSize))
      self.view.addSubview(iView)
      let image2 = UIImage(named: "square.png");
      iView.image = image2

      iView.userInteractionEnabled = true
      iView.addGestureRecognizer(tap)
      tap.addTarget(self, action: "Tap")
    }

    func Tap(  //why can't I put an argument in here?//  ){
      let tapAlert = UIAlertController(title: "Tap Pressed", message: "You just tapped", preferredStyle: .Alert)
      tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
      self.presentViewController(tapAlert, animated: true, completion: nil)
    }
    //works but I've lost access to the sending object

如果我向 Tap 处理程序添加一个参数

func Tap(sender: UITapGestureRecognizer){

}
//crashes: [tapHandler]: unrecognized selector sent to instance

,它在 Tap 上崩溃。我更希望有一个可以访问发件人对象的方法。有没有一种方法可以手动创建 GestureRecognizer 处理程序并访问发送者对象,就像您通过 Interface Builder 那样?

选择器名称是 Swift 从 Objective C 继承而来的。在 Objective C 中,具有单个参数的选择器的名称为 selector:selector 相反,这意味着 - 没有参数。将 addTarget 中的操作名称从 Tap 更改为 Tap: 然后它应该可以工作。