Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用地图在swift中设置联合发布器_Swift_Dictionary_Subscription_Assign_Combine - Fatal编程技术网

使用地图在swift中设置联合发布器

使用地图在swift中设置联合发布器,swift,dictionary,subscription,assign,combine,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 = Swif

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

如何将此处所需的格式转换为此代码


谢谢

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

您得到的错误是,
self.state
的类型为
SwiftUIViewCModelState
,但该值已通过
map
操作符转换为
SwiftUIViewEModelState
。最后一步(
.assign(to:\.state,on:self)
)尝试将此新值保存回原始的
self.state
变量,但无法保存,因为它现在是另一种类型

我也不知道为什么您希望有一个发布者/订阅者链来修改变量并将其保存回自身


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

。你的解释恰到好处!说得太快,这是汇编;但当我运行它时,它崩溃了。在我声明静态共享对象时崩溃。确定。使其工作,需要更改模型,使其在安装自身之前不会尝试创建子组件。