使用地图快速设置合并发布者

时间:2020-07-05 08:44:55

标签: swift dictionary subscription assign combine

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 '(又名'KeyPath ')

如何在此代码中获得所需的格式?

谢谢

1 个答案:

答案 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

相关问题