为点击手势和通知声明功能时 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
的原因。
执行选择器时,执行的附加对象显然并非总是无用的。如果您有多个手势识别器或 UIButton
s 连接到一个方法。然后知道谁是 sender
是有用的。对于通知,该参数通常包含一些有关通知的信息,这些信息可能会有用。
我知道点击手势和通知的工作原理,所以这不是问题。
我注意到有些人使用 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
的原因。
执行选择器时,执行的附加对象显然并非总是无用的。如果您有多个手势识别器或 UIButton
s 连接到一个方法。然后知道谁是 sender
是有用的。对于通知,该参数通常包含一些有关通知的信息,这些信息可能会有用。