Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 通过可观测的闭包的泛型func_Generics_Closures_Observable_Rx Swift - Fatal编程技术网

Generics 通过可观测的闭包的泛型func

Generics 通过可观测的闭包的泛型func,generics,closures,observable,rx-swift,Generics,Closures,Observable,Rx Swift,我必须制定一个方法,在我的条件为真时可以观察到。我在闭包中通过如下条件: Observable.retrySource{$0!=20} 我的func必须使用通用参数,如map、flatMap 扩展类型{ func retrySource<T: Error>(closure: @escaping (T) -> Bool) -> Observable<E> { return retryWhen { (error: Observable<T>)

我必须制定一个方法,在我的条件为真时可以观察到。我在闭包中通过如下条件:

Observable.retrySource{$0!=20}

我的func必须使用通用参数,如map、flatMap

扩展类型{

 func retrySource<T: Error>(closure: @escaping (T) -> Bool) -> Observable<E> {
    return retryWhen { (error: Observable<T>) in
        return error
            .flatMap { value -> Observable<Void> in
                guard closure(value) else {
                    return .error(error as! Error)
                }

                return Observable.just(Void())
        }
    }
}

如果我理解你想要什么,这应该可以,但在你发布的示例代码中不行。那会重新订阅按钮,根本没有任何意义

请尝试以下示例:

numberButton.rx.tap
    .flatMapLatest {
        randomProducer(0..<6) // random int
            .asObservable()
            .retrySource { $0 != 5 } // but can't equal 5
    }
    .subscribe(onNext: { print($0) },
               onError: { print($0) },
               onCompleted: { print("finish") })
    .disposed(by: bag)

我不理解上下文。一个可观察对象会发出多个事件。是否要筛选事件,以便在$0!=20时不会发出该值?嗨!我想当$0!=20为false时,我的可观察开始会再次发出值,以便使用两个可观察对象?不)只有一个可观察对象我编写新代码/它已编译但不起作用(现在你所要做的就是接受正确的答案。谢谢!
numberButton.rx.tap
    .flatMapLatest {
        randomProducer(0..<6) // random int
            .asObservable()
            .retrySource { $0 != 5 } // but can't equal 5
    }
    .subscribe(onNext: { print($0) },
               onError: { print($0) },
               onCompleted: { print("finish") })
    .disposed(by: bag)
extension ObservableType {
    func retrySource(_ pred: @escaping (E) -> Bool) -> Observable<E> {
        return map { element in
            guard pred(element) else { throw RetrySourceError() }
            return element
        }
        .retryWhen { error in
            error.map {
                guard $0 is RetrySourceError else { throw $0 }
            }
        }
    }
}

struct RetrySourceError: Error { }
func randomProducer(_ range: Range<Int>) -> Single<Int> {
    return Single.create {
        $0(.success(Int.random(in: range)))
        return Disposables.create()
    }
}