gpt4 book ai didi

swift - 一般在 SignalProducer 中注入(inject)副作用

转载 作者:行者123 更新时间:2023-11-30 12:43:25 24 4
gpt4 key购买 nike

我的应用程序顶部有一个状态区域,显示进度信息(类似于 Xcode 和 iTunes)。我想通过将副作用注入(inject)事件流来更新它,使用将流的值转换为 ProgressUpdate 值的闭包。我在 SignalProducer 上使用了扩展,因此我的应用程序中的任何信号生成器都可以更新应用程序的状态区域(同时允许多个信号涉及更多操作,但这不会影响此问题)。

我基于 SignalProducer 的 on(starting:,started:,...)。它需要最新的 swift 3.1 beta 才能允许对错误类型的限制,但这是直接来自 Playground 的。

import ReactiveSwift

struct Rc2Error: Error {
}

struct ProgressUpdate {
let message: String
let value: Double = -1
}

class MacAppStatus {
fileprivate func process(event: (Event<ProgressUpdate, Rc2Error>) -> Void)
{
//update UI based on the event
}
}


extension SignalProducer where Error == Rc2Error {
func updateProgress<Value>(status: MacAppStatus, converter: @escaping (Value) -> ProgressUpdate) -> SignalProducer<Value, Error>
{
return SignalProducer<Value, Error> { observer, compositeDisposable in
self.startWithSignal { signal, disposable in
compositeDisposable += disposable
compositeDisposable += signal
.on(event: { (orignal) in
switch original {
case .completed:
status.process(Event<ProgressUpdate, Rc2Error>.completed)
case .interrupted:
status.process(Event<ProgressUpdate, Rc2Error>.interrupted)
case .failed(let err):
status.process(Event<ProgressUpdate, Rc2Error>.failed(err))
case .value(let val):
status.process(Event<ProgressUpdate, Rc2Error>.value(converter(val)))
}
})
.observe(observer)
}
}
}
}

```

.observe(observer) 的最后一行产生错误:

error: cannot convert value of type 'Observer<Value, Rc2Error>' to expected argument type 'Observer<_, Rc2Error>'

您知道为什么此转换失败吗?关于以不同方式完成此任务的建议?

最佳答案

看起来这只是编译器报告的错误。实际的问题是 process() 应该接受一个事件,而不是一个接受事件的闭包。它还需要一个空的外部参数名称。

将签名更改为

    fileprivate func process(_ event: Event<ProgressUpdate, Rc2Error>) 

并修复了 Mike Taverne 指出的原始拼写错误。

关于swift - 一般在 SignalProducer 中注入(inject)副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41968989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com