Swift 如何使用Combine&;迅捷

Swift 如何使用Combine&;迅捷,swift,model,swiftui,combine,Swift,Model,Swiftui,Combine,我一直在学习Swift和SwiftUI,直到最近一切都很顺利。我已成功使用@Published属性保持数据和视图同步。但是,我现在想显示一些数据,这些数据是几个@已发布的属性的组合 简化数据模型类: import Foundation final class GameAPI: ObservableObject { struct PlayerStats: Identifiable, Codable { var gamesPlayed: Int var w

我一直在学习Swift和SwiftUI,直到最近一切都很顺利。我已成功使用
@Published
属性保持数据和视图同步。但是,我现在想显示一些数据,这些数据是几个
@已发布的
属性的组合

简化数据模型类:

import Foundation

final class GameAPI: ObservableObject {

    struct PlayerStats: Identifiable, Codable {
        var gamesPlayed: Int
        var wins: Int
        var losses: Int
    }

    struct Player: Identifiable, Codable {
        var id = UUID()
        var name: String
        var stats: PlayerStats
    }

    struct Room: Identifiable, Codable {
        var id = UUID()
        var name: String
        var players: [Player]
    }

    struct ServerStats {
        var totalGamesPlayed: Int
        var totalPlayers: Int
        var totalPlayersOnline: Int
    }

    @Published var players: [Player] = []
    @Published var rooms: [Room] = []

    func addPlayer(name: String) {
        players.append(Player(
            name: name,
            stats: PlayerStats(
                gamesPlayed: 0,
                wins: 0,
                losses: 0
            )
        ))
    }

    func removePlayer(id: UUID) { ... }

    func updatePlayerStats(playerId: UUID, stats: PlayerStats) { ... }

    func getLeaderboard() -> [Player] {
        return players.sorted({ $0.stats.wins > $1.stats.wins }).prefix(10)
    }

    func getServerStats() -> ServerStats {
        return ServerStats(
            totalGamesPlayed: ...,
            totalPlayers: ...,
            totalPlayersOnline: ...,
        )
    }
}
视图:


如何将视图连接到排行榜和服务器统计数据,以便在数据模型更改时视图会刷新?

您看到的
GameAPI
上是否有特定函数不会导致视图刷新?你能添加排行榜的内容吗?只需使用两个按钮来添加/删除玩家,并在
排行榜
视图中使用一个简单的
列表
,即可正确刷新您的代码。@SebJachec我没有尝试就编写了这个示例,您完全正确,它可以正常工作。所以我的原始代码中肯定有什么地方出错了。非常感谢。您看到的
GameAPI
上是否有特定函数不会导致视图刷新?你能添加排行榜的内容吗?只需使用两个按钮来添加/删除玩家,并在
排行榜
视图中使用一个简单的
列表
,即可正确刷新您的代码。@SebJachec我没有尝试就编写了这个示例,您完全正确,它可以正常工作。所以我的原始代码中肯定有什么地方出错了。非常感谢。
import SwiftUI

struct LeaderboardTabView: View {
    @EnvironmentObject var gameAPI: GameAPI

    var body: some View {
        VStack {
            Text("TOP PLAYERS")
            Leaderboard(model: gameAPI.getLeaderboard())
            // ^^^ How can I make the view automatically refresh when players are added/removed or any of the player stats change?
        }
    }
}