iOS 13,Swift 5.x
我正在尝试使组合订阅/发布者的语法正确。我有一个可行的示例,并且试图复制它,但是我遗漏了一些内容。我看不到树木的木头。这是我的代码。
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
如何在此代码中获得所需的格式?
谢谢
答案 0 :(得分:1)
我不太确定这段代码的目的。
您得到的错误是self.state
的类型为SwiftUIViewCModelState
,但是该值是通过SwiftUIViewEModelState
运算符转换为map
的。最后一步(.assign(to: \.state, on: self)
试图将这个新值保存回原始self.state
var,但是不能,因为它现在是另一种类型。
我也不知道您为什么要拥有一个发布者/订阅者链来修改变量并将其保存回自己?
一种用于编译代码的方法是添加一个新变量var state2: SwiftUIViewEModelState
,然后将.assign
行更改为.assign(to: \.state2, on: self)
。这将创建一个使用state
var作为发布者的订阅链,通过map
更改其类型,然后将修改后的值保存到state2
。