Search code examples
swiftrx-swift

RxCocoa: Cannot invoke 'bind' with an argument list of type '(to: (UITapGestureRecognizer) -> Void)'


I use RxCocoa, I have code like this,

func debug(){
        isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer()
        tap.numberOfTapsRequired = 2
        addGestureRecognizer(tap)


        tap.rx.event.bind { (event) in

            if self.phone.text == Phone.one{
                self.phone.text = Phone.two
            }
            else{
                self.phone.text = Phone.one
            }
            self.verification.text = ""
        }.disposed(by: rx.disposeBag)

    }

I want to do some encapsulation, turn the above to this:

func debug( _ event: (UITapGestureRecognizer) -> Void){


        isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer()
        tap.numberOfTapsRequired = 2
        addGestureRecognizer(tap)
        tap.rx.event.bind(to: event).disposed(by: rx.disposeBag)

    }

Xcode reports:

Cannot invoke 'bind' with an argument list of type '(to: (UITapGestureRecognizer) -> Void)'

I try

 func debug( _ event: @escaping (UITapGestureRecognizer) -> Void){

Xcode reports:

 Cannot invoke 'bind' with an argument list of type '(to: @escaping (UITapGestureRecognizer) -> Void)'

What matters? Rx name space?

When I type eventin the former, Xcode tips event is UITapGestureRecognizer

111


Solution

  • I think bind(onNext: @escaping (E) -> Void) is what you look for, rather than bind<O: ObserverType>(to observer: O).

    Compare implementations:

    public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E {
        return self.subscribe(observer)
    }
    
    public func bind(onNext: @escaping (E) -> Void) -> Disposable {
        return subscribe(onNext: onNext, onError: { error in
            rxFatalErrorInDebug("Binding error: \(error)")
        })
    }