首页 > 解决方案 > 如何在没有“序列不包含任何元素”的情况下将 Maybe 转换为 Single

问题描述

我正在使用 RxSwift(https://github.com/ReactiveX/RxSwift)。

我写了以下代码:

let m1 = Maybe<String>.empty()
let m2 = Maybe<String>.just("AA")

let s1 = m1.asObservable().asSingle()
let s2 = m2.asObservable().asSingle()


Single.zip(s1, s2).subscribe(onSuccess: { a, b in
    print("==================")
    print(a)
    print(b)
    print("==================")
}, onError: { e in
    print("EEEEE")
    print(e) // Sequence doesn't contain any elements.
}).disposed(by: disposeBag)

发生错误"Sequence doesn't contain any elements",因为m1Maybe#empty

如何隐蔽Maybe<String>Single<String?>

如果Maybeempty,我想做nil.

在这种情况下,我希望a变量为nil.

标签: swiftreactive-programmingrx-swift

解决方案


自我解决

let s1 = m1.asObservable().first()

文件(评论)说

/**
 The `first` operator emits only the very first item emitted by this Observable,
 or nil if this Observable completes without emitting anything.
 
 - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)
 
 - returns: An observable sequence that emits a single element or nil if the source observable sequence completes without emitting any items.
 */

https://github.com/ReactiveX/RxSwift/blob/c6c0c540109678b96639c25e9c0ebe4a6d7a69a9/RxSwift/Traits/ObservableType%2BPrimitiveSequence.swift#L30

自定义扩展版本

自定义扩展版本我认为我不需要,但如果有必要

extension Maybe {
    func asOptionalElementSingle() -> Single<Element?> {
        return self.asObservable().first()
    }
}

推荐阅读