Ios 定制Flatmap最新版本,无包装

Ios 定制Flatmap最新版本,无包装,ios,swift,generics,rx-swift,Ios,Swift,Generics,Rx Swift,我有一些测试函数,可以观察值并将它们映射到另一个可观察的: private func test1() { selectedTagsVariable .asObservable() .flatMapLatest { [weak self] tags -> Observable<PostSet> in guard let strongSelf = self else { return .empty() }

我有一些测试函数,可以观察值并将它们映射到另一个可观察的

private func test1() {
    selectedTagsVariable
        .asObservable()
        .flatMapLatest { [weak self] tags -> Observable<PostSet> in
            guard let strongSelf = self else { return .empty() }
            return strongSelf.postSetObservable(for: tags)
        }
}
看起来是这样的:

private func test2() {
    selectedTagsVariable
        .asObservable()
        .xflatMapLatest(weak: self) { obj, tags -> Observable<PostSet> in
            return obj.postSetObservable(for: tags)
        }
}
private func test2(){
选定的标记变量
.asObservable()
.xflatMapLatest(弱:self){obj,标记->在中可见
return obj.postSetObservable(对于:标记)
}
}

问题:我不喜欢返回类型中的
xflatMapLatest
函数中的类型转换(
as!Observable
)。我能把它移走吗?重构此方法的帮助:)

只需简单修改即可镜像
flatMapLatest
操作符。看看它的签名:

func flatMapLatest<O : ObservableConvertibleType>(_ selector: @escaping (Self.E) throws -> O) -> RxSwift.Observable<O.E>
了解了这一点,您就很容易看到需要做哪些小的更改才能使其正常工作:

extension ObservableType {
    func flatMapLatestWeak<A: AnyObject, O: ObservableConvertibleType>(weak obj: A, selector: @escaping (A, E) throws -> O) -> Observable<O.E> {
        return flatMapLatest { [weak obj] value -> Observable<O.E> in
            guard let strongObj = obj else {
                return Observable.empty()
            }
            return try selector(strongObj, value).asObservable()
        }
    }
}

您需要的是通过简单的修改镜像
flatMapLatest
操作符。看看它的签名:

func flatMapLatest<O : ObservableConvertibleType>(_ selector: @escaping (Self.E) throws -> O) -> RxSwift.Observable<O.E>
了解了这一点,您就很容易看到需要做哪些小的更改才能使其正常工作:

extension ObservableType {
    func flatMapLatestWeak<A: AnyObject, O: ObservableConvertibleType>(weak obj: A, selector: @escaping (A, E) throws -> O) -> Observable<O.E> {
        return flatMapLatest { [weak obj] value -> Observable<O.E> in
            guard let strongObj = obj else {
                return Observable.empty()
            }
            return try selector(strongObj, value).asObservable()
        }
    }
}
extension ObservableType {
    func flatMapLatestWeak<A: AnyObject, O: ObservableConvertibleType>(weak obj: A, selector: @escaping (A, E) throws -> O) -> Observable<O.E> {
        return flatMapLatest { [weak obj] value in
            try obj.map{ try selector($0 , value).asObservable() } ?? .empty()
        }
    }
}