【问题标题】:Setting up a combine publisher in swift using map使用地图快速设置联合发布者
【发布时间】:2023-03-06 11:51:01
【问题描述】:

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”)

如何在此代码中获取它需要的格式?

谢谢

【问题讨论】:

    标签: swift dictionary subscription assign combine


    【解决方案1】:

    我不太确定这段代码的目的是什么。

    您得到的错误是self.state 的类型为SwiftUIViewCModelState,但该值已通过map 运算符转换为SwiftUIViewEModelState。最后一步 (.assign(to: \.state, on: self)) 尝试将这个新值保存回原来的 self.state var,但它不能,因为它现在是不同的类型。

    我也不确定您为什么要使用发布者/订阅者链来修改变量并将其保存回自身?

    使代码编译的一种方法是添加一个新变量var state2: SwiftUIViewEModelState,然后将.assign 行更改为.assign(to: \.state2, on: self)。这将创建一个使用state var 作为发布者的订阅链,通过map 更改其类型,然后将修改后的值保存到state2

    【讨论】:

    • 谢谢丹。你的解释修复是正确的!
    • 说话太早了,编译;但是当我运行它时崩溃。崩溃就行了我声明静态共享对象。
    • 好的。让它工作,需要更改模型,以便在它自己设置之后才尝试创建子。
    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多