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

时间:2020-10-28 16:51:04

标签: swiftui publisher

以下代码有效,并将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)

所以这段代码看起来非常丑陋,我想为所有@Published变量写一个函数:

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

这将引发错误:Cannot infer contextual base in reference to member 'ready'

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

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

0 个答案:

没有答案