通过取第一个元素将 Observable<[T]> 转换为 Observable<T> 的 RxSwift 运算符
RxSwift operator for transforming Observable<[T]> to Observable<T> by taking first element
目前我在做这样的事情:
Observable.just([1, 2, 3, 4])
.flatMapLatest {
numbers in
guard number = numbers.first else {
return Objservable.empty()
}
return Observable.just(number)
}
是否有更惯用的方法或我可以使用的任何预建运算符?
您的实现方式完全正确。我只是用 flatMap
代替 flatMapLatest
因为它是一个更通用的运算符,我们不需要 flatMapLatest
.
的特殊逻辑
您可以创建自己的运算符来应用于类型为 Collection
的可观察对象。
extension Observable where Element : Collection {
func mapFirst() -> Observable<Element.Iterator.Element> {
return self.flatMap { elements in
guard number = numbers.first else {
return Objservable.empty()
}
return Observable.just(number)
}
}
}
你的方案很好,你可以eg.将它移到扩展中,它会更通用。
但是,如果您真的想以其他方式执行此操作:您可以查看 RxOptionals 并像这样使用它:
Observable.just([1, 2, 3, 4])
.filterEmpty()
.map { [=10=].first }
.filterNil()
目前我在做这样的事情:
Observable.just([1, 2, 3, 4])
.flatMapLatest {
numbers in
guard number = numbers.first else {
return Objservable.empty()
}
return Observable.just(number)
}
是否有更惯用的方法或我可以使用的任何预建运算符?
您的实现方式完全正确。我只是用 flatMap
代替 flatMapLatest
因为它是一个更通用的运算符,我们不需要 flatMapLatest
.
您可以创建自己的运算符来应用于类型为 Collection
的可观察对象。
extension Observable where Element : Collection {
func mapFirst() -> Observable<Element.Iterator.Element> {
return self.flatMap { elements in
guard number = numbers.first else {
return Objservable.empty()
}
return Observable.just(number)
}
}
}
你的方案很好,你可以eg.将它移到扩展中,它会更通用。 但是,如果您真的想以其他方式执行此操作:您可以查看 RxOptionals 并像这样使用它:
Observable.just([1, 2, 3, 4])
.filterEmpty()
.map { [=10=].first }
.filterNil()