Swift 中的 Target-Action 参数问题

Target-Action parameter issue in Swift

我正在关注 iOS 开发教程并阅读他们的代码。 第一个代码:

override func viewDidLoad() {
    super.viewDidLoad()

    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
    gestureRecognizer.cancelsTouchesInView = false
    tableView.addGestureRecognizer(gestureRecognizer)
}

第二个代码:

@objc func hideKeyboard(_ gestureRecognizer: UIGestureRecognizer) {
    let point = gestureRecognizer.location(in: tableView)
    let indexPath = tableView.indexPathForRow(at: point)
    if indexPath != nil && indexPath!.section == 0 && indexPath!.row == 0 {
        return
    }
    descriptionTextView.resignFirstResponder()
}

据我了解,当用户点击屏幕上的任意位置时,第一个代码使键盘消失。为了实现这一点,采用了目标-动作模式。

在第一个代码中,#selector(hideKeyboard),hideKeyboard 似乎没有任何参数。那么为什么helper函数中会有一个参数(第二个代码)。

如果参数有效,为什么是gestureRecognizer: UIGestureRecognizer
我不太明白参数传递是如何工作的?

A UIGestureRecognizer 总是将自身作为参数传递给 action 处理程序方法。在处理例程中使用 UIGestureRecognizer 而不是 UITapGestureRecognizer 是可以的,因为 UIGestureRecognizerUITapGestureRecognizer 的超类,但在这种情况下传递的实际上是 UITapGestureRecognizer实例.

如果这个处理例程没有被其他 UIGestureRecognizers 使用,我会这样写:

@objc func hideKeyboard(_ gestureRecognizer: UITapGestureRecognizer) {

这允许您访问 UITapGestureRecognizer 的属性,这些属性在超类中不常见。

selector 语法只是使用一种快捷语法,在这种情况下足以识别该方法。它可以使用 #selector(hideKeyboard(_:)) 来表示有一个参数,但没有必要。

请注意,处理程序例程的参数必须是手势识别器。您不能替换其他类型,但如果您不需要访问手势识别器,则可以在处理程序例程中完全不使用该参数。