Swift 如何使用Combine&;迅捷
我一直在学习Swift和SwiftUI,直到最近一切都很顺利。我已成功使用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
@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?
}
}
}