2017-04-01 49 views
0

ReactiveSwift和FRP的新特性通常會嘗試構建一個小型計算器應用程序以嘗試獲取它的掛件,並且我不知道如何做到這樣做。如果我有一個函數需要一個值,那麼我該如何將這個值傳遞給一個不斷應用傳遞值的函數以及之前所有值的結果的流?例如,我將如何添加一個整數流?示例代碼將非常有用。事情是這樣的使用ReactiveSwift添加數字流

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) 
    } 
}