一般来说,在ReactiveSwift和FRP公司工作不久,我试图建立一个小型的计算器应用程序来尝试掌握它的窍门,而我却一直在想这样做的反应方式。如果我有一个接受值的函数,我如何将该值传递给一个流,该流不断地应用一个接受所传递值的函数,以及所有先前值的结果?例如,如何将一个整数流相加?示例代码将非常有用。像这样的东西

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

最佳答案

您可能想看看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)
    }
}

关于swift - 使用ReactiveSwift添加数字流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43161499/

10-09 09:39