Skip to content

Instantly share code, notes, and snippets.

@advantis
Created September 24, 2014 09:04
Show Gist options
  • Save advantis/f27d54cb1b7f58f3de69 to your computer and use it in GitHub Desktop.
Save advantis/f27d54cb1b7f58f3de69 to your computer and use it in GitHub Desktop.
C#-inspired event handling in Swift
typealias EventHandler = (AnyObject) -> Void
class Event {
var handlers: [EventHandler] = []
func subscribe(handler: EventHandler) {
handlers.append(handler)
}
dynamic func invoke(sender: AnyObject) {
handlers.map({$0(sender)})
}
}
func +=(event: Event, handler: EventHandler) {
event.subscribe(handler)
}
extension UIControl {
struct ControlEvents {
static let TouchUpInside = "TouchUpInside"
}
var TouchUpInside: Event {
return objc_getAssociatedObject(self, ControlEvents.TouchUpInside) as Event! ?? {
let event = Event()
self.addTarget(event, action: "invoke:", forControlEvents:UIControlEvents.TouchUpInside)
objc_setAssociatedObject(self, ControlEvents.TouchUpInside, event, UInt(OBJC_ASSOCIATION_RETAIN))
return event
}()
}
}
class ViewController: UIViewController {
@IBOutlet
weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.TouchUpInside += action
button.TouchUpInside += {sender in
println("closure: \(sender)")
}
}
func action(sender: AnyObject) {
println("method: = \(sender)")
}
}
Copy link

ghost commented Feb 14, 2017

How does this work with unsubscribing?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment