迅速input强烈的select器

我不知道可以快速实现强typesselect器吗? 例如,如果我有一个名为buttonTapped(sender: AnyObject)在我的视图控制器的方法后来当我们添加该方法作为目标的一些button,我们可以只是说

 button.addTarget(self, selector:ViewController.buttonTapped(self), forControlEvents: .TouchUpInside) 

Swift 2.2有使用#selector语法的编译时间检查select器,请参阅https://swift.org/blog/swift-2-2-new-features/以及使用Cocoa和Objective-C的Swift(Swift 2.2)

对于你的例子,它会这样写:

button.addTarget(self, selector: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)

过时了。 请参阅ClausJørgensen对Swift 2.2+ 的回答

在Swift中没有“select器”的概念。 理想情况下,closures应该用于这样的目的。

你真正想要的是这样的

 button.addAction(forControlEvents: .TouchUpInside) { // watch out for retain cycle, use weak or unowned accordingly ViewController.buttonTapped(self) } 

你可以使用这个代码(未经testing,但它应该给你一个起点)

 public class ClosureWrapper : NSObject { let _callback : Void -> Void init(callback : Void -> Void) { _callback = callback } public func invoke() { _callback() } } var AssociatedObjectHandle: UInt8 = 0 extension UIControl { public func addAction(forControlEvents events: UIControlEvents, withCallback callback: Void -> Void) { let wrapper = ClosureWrapper(callback) addTarget(wrapper, action:"invoke", forControlEvents: events) // as @newacct said in comment, we need to retain wrapper object // this only support 1 target, you can use array to support multiple target objects objc_setAssociatedObject(self, &AssociatedObjectHandle, wrapper, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC)) } } 

并希望在未来的SDK版本中,类似的方法需要closures而不是select器将被苹果添加,所以我们不需要自己去实现它们。

这是Bryan伟大的答案Swift 2.0版本:

 import UIKit public class CallbackHolder: NSObject { let callback: () -> Void init(callback: () -> Void) { self.callback = callback } public func call() { callback() } } private let AssociatedObjectHandle = UnsafePointer<Void>() extension UIButton { func addAction(forControlEvents events: UIControlEvents, withCallback callback: () -> Void) { let holder = CallbackHolder(callback: callback) addTarget(holder, action: "call", forControlEvents: events) objc_setAssociatedObject(self, AssociatedObjectHandle, holder, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) // prevent garbage collection } }