SwiftUI 观察已发布对象的已发布对象

Sha*_*awn 4 swiftui combine

当按下按钮时,一个玩家被添加到游戏中,我想通过视图模型观察游戏中的变化。当我按下按钮时,计数器没有改变。

就好像我需要 中的游戏既是ContentViewModel@ObservedObject@Published

有人可以帮助我了解为什么设置错误以及如何修复它的基本原理吗?

import SwiftUI
import Combine

class Game: ObservableObject {
    @Published var players: [String] = []

    func addPlayer(_ player: String) {
        players.append(player)
    }
}

class ContentViewModel: ObservableObject {
    @Published var game: Game {
        didSet {
            subscription = game.objectWillChange.sink { [weak self] _ in
                self?.objectWillChange.send()
            }
        }
    }
    var subscription: AnyCancellable?

    init(game: Game) {
        self.game = game
    }
}

struct ContentView: View {
    @ObservedObject var viewModel: ContentViewModel

    var body: some View {
        Text("Num players: \(viewModel.game.players.count)")
            .padding()

        Button("Add player") {
            viewModel.game.addPlayer("player")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Geo*_*e_E 8

您想要设置subscriptioninit. 这将确保每次game对象实例发生更改时,您也会触发ContentViewModel更改。

您的代码不起作用,因为只有对象实例正在发生变化 - 而不是对象引用。所以game不会触发didSet,因此你永远不会设置subscription

代码:

class ContentViewModel: ObservableObject {
    @Published var game: Game
    var subscription: AnyCancellable?

    init(game: Game) {
        self.game = game

        subscription = game.objectWillChange.sink { [weak self] _ in
            self?.objectWillChange.send()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)