SwiftUI:如何将@Published变量传递给函数参数并获取值

SwiftUI:如何将@Published变量传递给函数参数并获取值,swiftui,publisher,Swiftui,Publisher,下面的代码工作并将topLeftGameState分配给计时器。如果globalGameState更改为running,则topLeftGameState会相应更改 @Published var topLeftGameState: GameState = .notReady @Published var topRightGameState: GameState = .notReady @Published var bottomLeftGameState: GameState = .notRead

下面的代码工作并将
topLeftGameState
分配给计时器。如果
globalGameState
更改为
running
,则
topLeftGameState
会相应更改

@Published var topLeftGameState: GameState = .notReady
@Published var topRightGameState: GameState = .notReady
@Published var bottomLeftGameState: GameState = .notReady

private let timerPublisher = Timer.publish(every: 0.01, on: .main, in: .common)    
// ...
 timerPublisher.autoconnect().sink(receiveValue: { currentDate in
        switch self.globalGameState {
        case .running(startDate: let startDate):
            let elapsedTime = currentDate - startDate
            if self.topLeftGameState == .ready { //,   {
                self.topLeftGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
            if case .running(elapsedTime: _) = self.topLeftGameState {
                self.topLeftGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
            
            if self.topRightGameState == .ready { //,   {
                self.topRightGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
            if case .running(elapsedTime: _) = self.topRightGameState {
                self.topRightGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
            
            if self.bottomLeftGameState == .ready { //,   {
                self.bottomLeftGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
            if case .running(elapsedTime: _) = self.bottomLeftGameState {
                self.bottomLeftGameState = .running(elapsedTime: elapsedTime.timeInterval)
            }
        default: ()
        }
    }).store(in: &cancellables)
因此,这段代码看起来非常难看,我想为所有发布的
@变量编写一个函数:

    addTimePublisher(for: topLeftGameState)
    addTimePublisher(for: topRightGameState)
        //...
    private func addTimePublisher(for gameState: Published<GameState>.Publisher) {
        timerPublisher.autoconnect().sink(receiveValue: { currentDate in
            switch self.globalGameState {
            case .running(startDate: let startDate):
                let elapsedTime = currentDate - startDate
                if self.gameState == .ready {
                    self.gameState = .running(elapsedTime: elapsedTime.timeInterval)
                }
                if case .running(elapsedTime: _) = self.gameState {
                    self.gameState = .running(elapsedTime: elapsedTime.timeInterval)
                }
                
            default: ()
            }
            print(currentDate)
        }).store(in: &cancellables)
    }
addTimePublisher(适用于:topLeftGameState)
addTimePublisher(适用于:topRightGameState)
//...
私有func addTimePublisher(适用于游戏状态:Published.Publisher){
timerPublisher.autoconnect().sink(接收值:{currentDate in
开关自发光{
案例运行(开始日期:让开始日期):
设elapsedTime=currentDate-startDate
如果self.gameState==.ready{
self.gameState=.running(elapsedTime:elapsedTime.timeInterval)
}
如果case.running(elapsedTime:u)=self.gameState{
self.gameState=.running(elapsedTime:elapsedTime.timeInterval)
}
默认值:()
}
打印(当前日期)
}).store(在:&可取消项中)
}
这将引发一个错误:
无法推断引用成员“ready”的上下文基础。

我不知道如何从出版商那里获得适当的价值? 有人对我有什么建议吗

编辑:
如何编写函数并传递
@Published
变量?

将Published属性作为EnvironmentObject注入整个viewModel将更有意义,而不是尝试传递单个
@Published
属性。我不清楚您在做什么。“连接到
计时器发布器”
“是什么意思?您试图如何以及在何处调用
addTimePublisher
,在同一视图模型中,所有这些都发生在何处?你可能在问一个X-Y问题。但要回答您的最后一个问题-从您需要订阅的发布服务器获取值(使用
.sink
,就像使用计时器发布服务器一样)。我猜这不是你真正需要的对不起,我更新了我的问题。