Как понять эту функцию карты rx-swift - PullRequest
0 голосов
/ 28 мая 2019

В моем viewcontroller есть несколько текстовых файлов. И используйте 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} возвращает наблюдаемое. А как понять map {obs, tag в obs.map {tag}}? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

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, а вторая карта преобразует ObservableType из X в Observable из Y.

0 голосов
/ 28 мая 2019

Вывод:

obs.map{ tag }

, что представляет

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

Он заменяет управляющую последовательность .editingDidBegin на любое значение тега этого поля.

...