Swift 使用“合并”组合上一个值

Swift 使用“合并”组合上一个值,swift,reactive-cocoa,combine,reactive-swift,Swift,Reactive Cocoa,Combine,Reactive Swift,如何使用Combine框架重写ReactiveSwift/ReactiveCocoa代码?我附上了先前文档中的combinePrevious意思的屏幕截图 let producer = SignalProducer<Int, Never>([1, 2, 3]).combinePrevious(0) producer.startWithValues { value in print(value) // print: (0, 1), (1, 2), (2, 3) } let p

如何使用
Combine
框架重写
ReactiveSwift/ReactiveCocoa
代码?我附上了先前文档中的
combinePrevious
意思的屏幕截图

let producer = SignalProducer<Int, Never>([1, 2, 3]).combinePrevious(0)
producer.startWithValues { value in
    print(value) // print: (0, 1), (1, 2), (2, 3)
}
let producer=SignalProducer([1,2,3])。组合前(0)
producer.startWithValues{中的值
打印(值)//打印:(0,1)、(1,2)、(2,3)
}

我对
ReactiveSwift/reactivecococoa
不太熟悉,但根据您的描述,您可以使用,这似乎是一个比前面的
组合
更通用的函数

它接受一个初始结果(您可以将其转换为一个元组)和一个包含存储值和当前值的闭包,并返回一个新的存储值(在您的示例中,是一个包含
(上一个,当前)
)的元组):


这些是我提出的自定义运算符(称为
withPrevious
)。有两个重载,一个重载的初始上一个值是
nil
,另一个重载的初始上一个值是您提供的,因此您不必处理选项

扩展发布程序{
///在元组中包括来自上游发布服务器的当前元素和上一个元素,其中上一个元素是可选的。
///上游发布服务器第一次发出元素时,前一个元素将为“nil”。
///
///设范围=(1…5)
///可取消=range.publisher
///.withPrevious()
///.sink{print(\($0.previous),\($0.current)),终止符:)}
/////打印:“(无,1)(可选的(1),2)(可选的(2),3)(可选的(3),4)(可选的(4),5)”。
///
///-返回:来自上游发布服务器的上一个和当前元素元组的发布服务器。
func with previous()->AnyPublisher{
扫描(可选。无){($0?.1,$1)}
.compactMap{$0}
.删除任何发布者()
}
///在元组中包括来自上游发布服务器的当前元素和上一个元素,其中上一个元素不是可选的。
///上游发布服务器第一次发出元素时,前一个元素将是'initialPreviousValue'。
///
///设范围=(1…5)
///可取消=range.publisher
///.与上一个(0)
///.sink{print(\($0.previous),\($0.current)),终止符:)}
/////打印:“(0,1)(1,2)(2,3)(3,4)(4,5)”。
///
///-参数initialPreviousValue:上游发布服务器第一次发出时用作“previous”值的初始值。
///-返回:来自上游发布服务器的上一个和当前元素元组的发布服务器。
func with previous(\uInitialPreviousValue:Output)->AnyPublisher{
扫描((initialPreviousValue,initialPreviousValue)){($0.1,$1)}.eraseToAnyPublisher()
}
}

太棒了!谢谢
let producer = [1,2,3].publisher
                      .scan((0,0)) { ($0.1, $1) }

producer.sink { 
   print($0) 
}