你怎么知道哪个string作为Swift函数的select器?

有时,当我在Swift中使用select器(即Selectortypes)时,我为targetForAction(_:withSender:)参数提供的string文字targetForAction(_:withSender:)如: targetForAction(_:withSender:)targetForAction(_:withSender:) addTarget(_:action:)不会调用或映射到我期待的实际的Swift函数。

例如,当下面显示的MyResponder实例在响应者链中时,使用stringshowImage:调用targetForAction(_:withSender)时,无法find它。 知道什么是合适的string文字以提供不同types的Swift函数签名以及用于所需的和/或省略的参数标签的选项的模式是什么?

 import UIKit class MyResponder: UIResponder { func showImage( named filename: String ) { print( "Loading image..." ) } } class MyViewController: UIViewController { @IBAction func buttonTapped( sender: AnyObject? ) { if let responder = self.targetForAction( "showImage:", withSender: self ) as? MyResponder { responder.showImage(named: "my_image" ) } } } 

经过一些试用,错误和评论者的鼓励,我设法弄清楚了这个模式!

string文字必须遵循从你的Swift函数的签名转换而来的Objective-C语法,这是一个起初不是很明显的有趣的小@objc ,但是当你考虑像@objc这样的属性时,它是非常有意义的。 在写一个更好的代码示例,我似乎已经find了自己的映射模式。

functionName +( With + First )+ : +( second )+ :

只有当参数标签是必需的(即不省略)时,括号中的内容才是必需的。 并记住要利用WithFirst

在以下每个示例中, myObject都会将其自身作为提供的select器的目标返回,表明作为Selector提供的string实际上确实映射了它所针对的Swift函数。

 import UIKit class MyObject : UIResponder { func someFunction() {} func someFunction(param:String) {} func someLabeledFunction(param param:String) {} func someTwoArgumentFunction(param1:String, param2:String) {} func someTwoArgumentNoLabelFunction(param1:String, _ param2:String) {} func someHalfLabeledTwoArgumentFunction(param1 param1:String, _ param2:String) {} func someCompletelyLabeledTwoArgumentFunction(param1 param1:String, param2:String) {} } let myObject = MyObject() myObject.targetForAction("someFunction", withSender: nil) myObject.targetForAction("someFunction:", withSender: nil) myObject.targetForAction("someLabeledFunctionWithParam:", withSender: nil) myObject.targetForAction("someTwoArgumentFunction:param2:", withSender: nil) myObject.targetForAction("someTwoArgumentNoLabelFunction::", withSender: nil) myObject.targetForAction("someHalfLabeledTwoArgumentFunctionWithParam1::", withSender: nil) myObject.targetForAction("someCompletelyLabeledTwoArgumentFunctionWithParam1:param2:", withSender: nil)