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
,就像使用计时器发布服务器一样)。我猜这不是你真正需要的对不起,我更新了我的问题。