Как работает конечный синтаксис с PublicSubject <Void>.subscribe? - PullRequest
0 голосов
/ 24 октября 2018
let subject = PublishSubject<()>()
subject.subscribe {
  print("Why?") // onCompleted
}
.disposed(by: disposeBag)

Это объявление подписки (от RxSwift)

public func subscribe(onNext: ((Self.E) -> Void)? = default, onError: ((Error) -> Void)? = default, onCompleted: (() -> Void)? = default, onDisposed: (() -> Void)? = default) -> Disposable

Итак, Self.E также является Void типом.Почему onCompleted вызывается вместо onNext?Их семантика похожа (Void) -> Void

Я знаю, что я не должен писать такой код (как в примере), меня просто интересует это поведение

1 Ответ

0 голосов
/ 24 октября 2018

В Swift, только если последний параметр является замыканием, его можно опустить и заменить на замыкающее замыкание.То, что вы думаете, onCompleted на самом деле onDisposed.Вы можете видеть, что в этом коде:

var disposeBag = DisposeBag()

let subject = Observable<Void>.create { observer -> Disposable in
    observer.onCompleted()
    return Disposables.create()
}
subject.subscribe(onNext: { _ in
    print("onNext")
}, onError: { (_) in
    print("onError")
}, onCompleted: {
    print("onCompleted")
}, onDisposed:  {
    print("onDisposed")
})
.disposed(by: disposeBag)

Вы получите вывод:

onCompleted
onDisposed
...