如何理解此rx-swift映射功能

时间:2019-05-28 10:56:01

标签: swift rx-swift

我的视图控制器中有一些textfiled。并使用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}返回一个可观察值。以及如何了解地图{obs,在obs.map {tag}}中标记? 非常感谢你!

2 个答案:

答案 0 :(得分:0)

输出为:

obs.map{ tag }

代表

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

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

答案 1 :(得分:0)

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。