【问题标题】:How to understand this rx-swift map function如何理解这个 rx-swift map 函数
【发布时间】:2019-05-28 10:56:00
【问题描述】:

我的视图控制器中有一些文本文件。并使用 rx-swift 观察 .editingDidBegin 事件。

我想判断哪个文本字段发送事件。

let tags = txtFieldArray.map{($0.rx.controlEvent(.editingDidBegin), $0.tag)}
            .map{obs, tag in obs.map{tag}}
let value = Observable.merge(tags)
        value.bind {[weak self] (tags) in
            guard let strongSelf = self else { return }
            if let view = strongSelf.ipEnteryView.viewWithTag(tags) as? UITextField {
                strongSelf.viewMode.changeTextFiledBottomColor(view, true)
            }
            }.disposed(by: disposedBag)

txtFieldArray 的第一个映射返回一个数组,元素是元组(据我了解),第一个是 controlEvent,第二个是一个 int 值。我不明白的是第二个地图功能。 Obs 是 contrlEvent 类型。为什么 obs.map{tag} 返回一个 observable。以及如何理解 obs.map{tag}} 中的 map{obs, tag? 非常感谢!

【问题讨论】:

    标签: swift rx-swift


    【解决方案1】:

    输出是:

    obs.map{ tag }
    

    代表

    $0.rx.controlEvent(.editingDidBegin).map { $0.tag }
    

    它将 .editingDidBegin 控制序列替换为该字段的标记值。

    【讨论】:

    • 谢谢。你能解释一下如何将 controlEvent 转换为 observable(Int) 的更多细节吗?
    【解决方案2】:

    obs.map { tag } 返回一个 Observable,因为函数的签名是:

    ObservableType.map<Result>(_ transform: @escaping (Self.Element) throws -> Result) -> RxSwift.Observable<Result>

    由于map 返回一个 Observable,ops.map { tag } 返回一个 Observable。

    .map{obs, tag in obs.map{tag}} 采用(ControlEvent<()>, Int) 的数组,遍历每个元素将其转换为Observable<Int>

    map 只是一个函数,它转换调用它的仿函数的子类型。因此,第一个映射将 X 数组转换为 Y 数组,第二个映射将 X 的 ObservableType 转换为 Y 的 Observable。

    【讨论】:

    • 谢谢。 Observable.of(1, 2, 3) .map { $0 * 10} .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) 。它遍历每个元素并乘以 10。那么 obs.map{tag} 的细节是什么,将 ContrlEvent 转换为 Observable(Int)。