2017-01-01 3 views
0

Die erste beobachtbare Brände, aber die zweite nicht. Was gibt? Ich habe die Ereignisse im Block, d. H. Print ($ 0) im zweiten Block und umgekehrt, dann das erste funktioniert nicht, aber das zweite funktioniert. Was ist es mit $ 0 gegenüber einer regulären Zeichenkette, die das Observable beobachten lässt?RxSwift Abonnieren auf ControlEvent

 let someObservable = self.inputButton!.rx.tap.subscribe(){ 
     print($0) 
     } 

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

Antwort

2

In dem ersten, verwenden Sie die $0, die das erste Argument, das zur Schließung geführt wird, die Sie zur Verfügung gestellt haben.

let someObservable = self.inputButton!.rx.tap.subscribe(){ 
    print($0) 
} 

In diesem Fall entscheidet der Compiler, dass Sie tatsächlich den Aufruf der folgenden Funktion sind, weil es übereinstimmt, was Sie verwenden, dh es ist ein namenlos Argument erwartet, was wiederum einen Verschluss mit einem Argument ist, das event :

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

Sie können Ihren ersten Code wie folgt umschreiben:

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

Nun, sie einen Verschluss in dem zweiten bereitstellen, die das tut Es werden keine übergebenen Argumente verwendet. Der Compiler muss also eine andere Funktion finden, die zu diesem Zeitpunkt syntaktisch gültig ist. Wie in der Tat wird es dieses für Sie verwenden:

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) 

All dies Argumente der Funktion Standardwerte haben, und Sie können alle von ihnen ignorieren. Das letzte Argument onDispose ist vom Schließungstyp und kann mit der abschließenden Schließnotation geschrieben werden. Das bedeutet, dass die Schließung, die Sie hier passieren:

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

wird als Ihr dispose Block verwendet werden.


Daumenregel wenn RxSwift mit: explizit sein, Ihre Argumente nennen, die Art Ihrer Argumente, auf lange Sicht bieten wird Ihnen viel mehr Zeit ersparen!