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