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