Оператор с двумя последними элементами из Observable в RxSwift - PullRequest
1 голос
/ 23 октября 2019

У меня есть наблюдаемая последовательность Int s:

-1-2-3-4-5-6-3-4-5-1-

Например, мне нужно определить, когда предыдущий элемент был больше, чем последний.

В этой последовательностиэто (6, 3) и (5, 1):

-1-2-3-4-5-6-3-4-5-1-
-------------ˆ-----ˆ-

Какой оператор я могу использовать в этом случае?

1 Ответ

2 голосов
/ 23 октября 2019

Да scan - это оператор, которого вы ищете:

let stream = Observable<Int>.from([1, 2, 3, 4, 5, 6, 3, 4, 5, 1])
let seed = (0, 0) // (any Int, Int that smaller of all possible values of first emited Int)
let wrongPairs = stream
    .scan(seed) { last, new -> (Int, Int) in
        return (last.1, new)
    }
    .filter { $0.0 > $0.1 }

С помощью scan мы отображаем поток Int s в поток пар Int, а затем фильтруем все "хорошие" пары"(предыдущий элемент, если он меньше или равен):

-1-2-3-4-5-6-3-4-5-1-
-(0, 1)-(1, 2)-(2, 3)-(3, 4)-(4, 5)-(5, 6)-(6, 3)-(3, 4)-(4, 5)-(5, 1)-
-(6, 3)-(5, 1)-

Недостаток scan в том, что вам нужно начальное число для начала, что может быть проблематично в некоторых случаях, но если ваш поток всегда выдает положительные числа -1 будет работать.

...