RxSwift 订阅 ControlEvent

RxSwift Subscribing on ControlEvent

第一个 observable 触发,但第二个不触发。是什么赋予了?我切换了块中的事件,即第二个块中的 print($0) ,反之亦然,然后第一个不起作用,但第二个起作用。 $0 与使 observable observe 的常规字符串有什么区别?

      let someObservable  = self.inputButton!.rx.tap.subscribe(){
        print([=10=])
      }

      let someObservable1 = self.inputButton!.rx.tap.subscribe(){
        print("Hello")
      }

在第一个中,您使用的是 [=15=],这是传递给您提供的闭包的第一个参数。

let someObservable  = self.inputButton!.rx.tap.subscribe(){
    print([=10=])
}

在这种情况下,编译器决定您实际上是在调用以下函数,因为它与您正在使用的相匹配,即它需要一个无名参数,而该参数又是一个带有一个参数的闭包,event:

func subscribe(_ on: @escaping (Event<E>) -> Void)

您可以像这样重写您的第一个代码:

let someObservable  = self.inputButton!.rx.tap.subscribe() { event in
   print(event)
}

现在,在第二个中,您提供了一个闭包,它不使用任何传递的参数。因此,编译器必须找到另一个在此时语法上有效的函数。事实上,它会为您使用这个:

func subscribe(file: String = #file, line: UInt = #line, function: String = #function, onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)

这个函数的所有参数都有默认值,你可以忽略它们。最后一个参数 onDispose 是闭包类型,可以用尾随闭包符号来写。这意味着您在此处传递的闭包:

  let someObservable1 = self.inputButton!.rx.tap.subscribe(){
      print("Hello")
  }

将用作您的 dispose 块。


Rule of thumb when using RxSwift: Be explicit, name your arguments, provide the types of your arguments, in the long run you will spare a lot more time!