为点击手势和通知声明功能时 Parameters/Arguments 是必要的吗?

When Declaring A Function For Tap Gestures & Notifications Are Parameters/Arguments Necessary?

我知道点击手势和通知的工作原理,所以这不是问题。

我注意到有些人使用 parameter/argument 作为点击手势功能或通知功能:

override viewDidLoad(){
   super.viewDidLoad()


   NotificationCenter.default.addObserver(self, selector: #selector(notifyMe), name: NSNotification.Name(rawValue: notificationKey), object: nil)

   let gesture = UITapGesture(target: self, action: #selector(tapMe))
   view.addGestureRecognizer(gesture)
}


@objc func tapMe(_ sender: UITapGestureRecognizer){
   // do something
}

@objc func notifyMe(_ notification: Notification){
   // do something
}

但是我使用了带和不带 parameter/argument 的函数并且它们工作正常:

@objc func tapMe(){
   // do something
}

@objc func notifyMe(){
   // do something
}

如果没有 parameters/arguments 也能正常工作,那么使用 parameters/arguments 的目的是什么?

目的是能够识别和区分 sender / object 并且在通知的情况下能够从 userInfo 获得额外的信息/数据词典.

是的,你没看错,参数是可选的。这是因为执行选择器时,objective-C 运行时不关心选择器是否具有正确数量的参数或其他任何内容。它只是将一堆对象传递给选择器。如果选择器有匹配的参数,那么参数将具有传递的对象的相应值。如果没有,对象将被丢弃。这也是为什么您可以使用特定 UIControl 类型的参数、AnyObject 或根本没有参数来声明 IBAction 的原因。

执行选择器时,执行的附加对象显然并非总是无用的。如果您有多个手势识别器或 UIButtons 连接到一个方法。然后知道谁是 sender 是有用的。对于通知,该参数通常包含一些有关通知的信息,这些信息可能会有用。