struct ActioinSubscription: Subscription { let combineIdentifier = CombineIdentifier() let actionReciever: ActionReciever func request(_ demand: Subscribers.Demand) {} func cancel() { actionReciever.handler = nil } } internal final class ActionReciever: NSObject { private(set) weak var target: NSControl! var handler: ((NSControl) -> Void)? init(target: NSControl) { self.target = target target.target = self target.action = action } @IBAction private func action(_ sender: Any) { handler(target) } } extension NSControl { struct ControlActionPublisher: Combine.Publisher { typealias Output = NSControl typealias Failure = Never let actionReciever: ActionReciever init(target: Output) { self.actionReciever = ActionReciever(target: target) } func receive(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input { actionReciever.handler = { control in _ = subscriber.receive(control) } subscriber.receive(subscription: ActioinSubscription(actionReciever: actionReciever)) } } func actionPublisher() -> ControlActionPublisher { ActionReciever(target: self) } }