class ActionTarget { let handler: () -> Void init(handler: @escaping () -> Void) { self.handler = handler } @IBAction func handle() { handler() } } struct AnySubscription: Subscription { func request(_ demand: Subscribers.Demand) { _request(demand) } func cancel() { _cancel() } var combineIdentifier: CombineIdentifier = CombineIdentifier(NSUUID()) let _request: (Subscribers.Demand) -> Void let _cancel: () -> Void } extension UIControl { func eventPublisher(for event: UIControl.Event) -> AnyPublisher { return AnyPublisher { subscriber in var target: ActionTarget? subscriber.receive(subscription: AnySubscription(_request: { _ in }, _cancel: { target = nil })) target = ActionTarget { _ = subscriber.receive(self) } self.addTarget(target, action: #selector(ActionTarget.handle), for: event) } } }