你可以移动所有
@State var
s喜欢你的
GameViewModel
像
@Published var
s
class GameViewModel: ObservableObject {
@Published var someGameState = 1
@Published var anotherGameState = 1
func doSomething() {
print(someGameState)
}
func doSomethingElse() {
print(anotherGameState)
}
}
然后你可以把这个传给
GameViewRepresentable
通过
@ObservedObject
,以避免写出游戏视图所需的所有状态。
struct ContentView: View {
@StateObject var game = GameViewModel()
var body: some View {
GameViewRepresentable(game: game)
}
}
struct GameViewRepresentable: UIViewRepresentable {
@ObservedObject var game: GameViewModel
// ...
}
由于这是
UIViewRepresentable
,我想你可能正在更新
game
通过其属性的setter(而不是说
Binding
根据
ObservedObject
)。在这种情况下,您可以使用
didSet
要检测更改:
@Published var someGameState = 1 {
didSet { self.doSomething() }
}
@Published var anotherGameState = 1 {
didSet { self.doSomethingElse() }
}
否则,可以使用
onReceive
:
// add .dropFirst() if you don't want the initial value to trigger this
.onReceive(game.$someGameState) { _ in
game.doSomething()
}
.onReceive(game.$anotherGameState) { _ in
game.doSomethingElse()
}