0

通常是 ReactiveSwift 和 FRP 的新手,试图构建一个小型计算器应用程序来尝试掌握它,但我一直在寻找响应式方法来做这样的事情。如果我有一个接受一个值的函数,我如何将该值传递给一个不断应用一个函数的流,该函数接受所传递的值以及所有先前值的结果?例如,如何将整数流相加?示例代码将非常有帮助。像这样的东西

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

1 回答 1

2

您可能想看一下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)
    }
}
于 2017-04-10T19:45:43.730 回答