使用地图在 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.