使用地图在 swift 中设置合并发布者
Setting up a combine publisher in swift using map
iOS13,Swift5.x
我正试图在联合收割机上获得正确的语法 subscription/publisher。我有一个有效的例子,我试图复制它,但我遗漏了一些东西;只见树木不见森林。这是我的代码。
import Foundation
import Combine
class SwiftUIViewCModel: ObservableObject {
@Published var state : SwiftUIViewCModelState = .page1
static let shared = SwiftUIViewCModel()
private var stateUpdatingSubscriber: AnyCancellable?
init() {
self.stateUpdatingSubscriber = nil
self.stateUpdatingSubscriber = SwiftUIViewCModel.shared.$state
.map(modelCTomodelD(modelState:))
.receive(on: RunLoop.main)
.assign(to: \.state, on: self)
}
private func modelCTomodelD(modelState: SwiftUIViewCModelState) -> SwiftUIViewEModelState {
switch modelState {
case .page1:
return .page1
case .page2:
return .page2
default:
break
}
}
}
enum SwiftUIViewEModelState {
case page1
case page2
}
enum SwiftUIViewCModelState {
case page1
case page2
}
我在编译时遇到语法错误,但我不明白我需要做什么才能修复它。
无法将类型“(SwiftUIViewCModelState) -> SwiftUIViewEModelState”的值转换为预期的参数类型 'KeyPath<Published.Publisher.Output, SwiftUIViewCModelState>'(又名 'KeyPath<SwiftUIViewCModelState, SwiftUIViewCModelState>')
如何将这里需要的格式导入到这段代码中?
谢谢
我不太确定这段代码的用途是什么。
您收到的错误是 self.state
的类型为 SwiftUIViewCModelState
,但该值已通过 map
运算符转换为 SwiftUIViewEModelState
。最后一步 (.assign(to: \.state, on: self)
) 试图将这个新值保存回原来的 self.state
var,但它不能,因为它现在是不同的类型。
我也不确定您为什么想要一个 publisher/subscriber 链来修改变量并将其保存回自身?
编译代码的一种方法是添加一个新变量 var state2: SwiftUIViewEModelState
,然后将 .assign
行更改为 .assign(to: \.state2, on: self)
。这将创建一个使用 state
var 作为发布者的订阅链,通过 map
更改其类型,然后将修改后的值保存到 state2
.
iOS13,Swift5.x
我正试图在联合收割机上获得正确的语法 subscription/publisher。我有一个有效的例子,我试图复制它,但我遗漏了一些东西;只见树木不见森林。这是我的代码。
import Foundation
import Combine
class SwiftUIViewCModel: ObservableObject {
@Published var state : SwiftUIViewCModelState = .page1
static let shared = SwiftUIViewCModel()
private var stateUpdatingSubscriber: AnyCancellable?
init() {
self.stateUpdatingSubscriber = nil
self.stateUpdatingSubscriber = SwiftUIViewCModel.shared.$state
.map(modelCTomodelD(modelState:))
.receive(on: RunLoop.main)
.assign(to: \.state, on: self)
}
private func modelCTomodelD(modelState: SwiftUIViewCModelState) -> SwiftUIViewEModelState {
switch modelState {
case .page1:
return .page1
case .page2:
return .page2
default:
break
}
}
}
enum SwiftUIViewEModelState {
case page1
case page2
}
enum SwiftUIViewCModelState {
case page1
case page2
}
我在编译时遇到语法错误,但我不明白我需要做什么才能修复它。
无法将类型“(SwiftUIViewCModelState) -> SwiftUIViewEModelState”的值转换为预期的参数类型 'KeyPath<Published.Publisher.Output, SwiftUIViewCModelState>'(又名 'KeyPath<SwiftUIViewCModelState, SwiftUIViewCModelState>')
如何将这里需要的格式导入到这段代码中?
谢谢
我不太确定这段代码的用途是什么。
您收到的错误是 self.state
的类型为 SwiftUIViewCModelState
,但该值已通过 map
运算符转换为 SwiftUIViewEModelState
。最后一步 (.assign(to: \.state, on: self)
) 试图将这个新值保存回原来的 self.state
var,但它不能,因为它现在是不同的类型。
我也不确定您为什么想要一个 publisher/subscriber 链来修改变量并将其保存回自身?
编译代码的一种方法是添加一个新变量 var state2: SwiftUIViewEModelState
,然后将 .assign
行更改为 .assign(to: \.state2, on: self)
。这将创建一个使用 state
var 作为发布者的订阅链,通过 map
更改其类型,然后将修改后的值保存到 state2
.