Добавление потока чисел с использованием ReactiveSwift

Я новичок в ReactiveSwift и FRP в целом, пытаюсь создать небольшое приложение-калькулятор, чтобы попытаться освоить его, и я застрял в поиске реактивного способа сделать что-то подобное. Если у меня есть функция, которая принимает значение, как я могу передать это значение в поток, который постоянно применяет функцию, которая принимает переданное значение и результат всех предыдущих значений? Например, как бы я сложил поток целых чисел? Пример кода будет очень полезным. Что-то вроде этого

func apply(_ value: Int) {
 /// sends value to a stream that emits (value + previous values) to its observers
}

1 ответ

Вы, вероятно, хотите взглянуть на scan оператор, который позволяет указать начальное значение и функцию для накопления новых значений. Я не проверял этот код, но он будет примерно таким:

let (signal, observer) = Signal<Int, NoError>.pipe()

signal
    .scan(0) { acc, val in acc + val }
    .observeValues { val in print(val) }

observer.send(value: 15) // Should print 15
observer.send(value: 6) // Should print 21
observer.send(value: 3) // Should print 24

Вы могли бы обернуть это в класс как этот (снова, не проверял это, но это должно передать идею):

class Adder {
    public let output: Signal<Int, NoError>

    private let input: Observer<Int, NoError>

    init() {
        let (signal, observer) = Signal<Int, NoError>.pipe()

        self.input = observer

        self.output = signal
            .scan(0) { acc, val in acc + val }
    }

    func apply(_ value: Int) {
        input.send(value: value)
    }
}
Другие вопросы по тегам