使用ReactiveSwift添加数字流

时间:2017-04-01 20:11:07

标签: swift functional-programming reactive-swift

ReactiveSwift和FRP的新功能,尝试构建一个小型计算器应用程序以试图掌握它并且我很难搞清楚做出类似事情的反应方式。如果我有一个带值的函数,我该如何将该值传递给不断应用传递值的函数的流,以及所有先前值的结果?例如,我如何添加整数流?示例代码非常有用。像这样的东西

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

1 个答案:

答案 0 :(得分: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)
    }
}