JuniorКодЧастоЕщё не отвечали
Постройте небольшой конвейер с map, filter, compactMap и scan и скажите, что выдаёт каждый
Начиная с publisher строк String, постройте цепочку, которая:
- оставляет только числовые строки и преобразует их в
Int(остальное отбрасывает), - пропускает только чётные числа,
- выдаёт нарастающую сумму.
func runningEvenSum(_ input: AnyPublisher<String, Never>) -> AnyPublisher<Int, Never> {
input
// ваш код здесь — map / filter / compactMap / scan
}
Допишите реализацию и скажите, что выдаёт каждый оператор.
map преобразует каждый элемент один-к-одному и не отбрасывает. compactMap преобразует и отбрасывает nil, убирая нечисловые строки. filter пропускает лишь элементы по предикату. scan хранит аккумулятор и выдаёт текущую сумму после каждого элемента.
- ✗Путают
compactMap(отбрасываетnil) сmap(преобразует один-к-одному) - ✗Думают, что
scanвыдаёт лишь раз при завершении, а не на каждый элемент - ✗Считают, что
filterпреобразует значения, а не пропускает их насквозь
- →Чем
scanотличается отreduceпо тому, что он выдаёт? - →Когда вы возьмёте
compactMapвместоmapплюсfilter?
func runningEvenSum(_ input: AnyPublisher<String, Never>) -> AnyPublisher<Int, Never> {
input
.compactMap { Int($0) } // String -> Int?, drops non-numeric
.filter { $0 % 2 == 0 } // keeps even numbers only
.scan(0, +) // running sum of what passed
.eraseToAnyPublisher()
}
compactMap maps and unwraps in one step, dropping any nil; filter forwards only elements passing its predicate; scan carries an accumulator and emits it after every element. map (not needed here) would transform one-to-one without ever dropping.