
使用 let(简单引用)
Swift
struct ContentView: View {
let gameManager = GameManager.shared
var body: some View {
Text(gameManager.gameState.rawValue) // ❌ 不会自动更新!
}
}
问题:
获取的是单例的引用
但 不会触发视图更新 当 @Published 属性变化时
SwiftUI 不知道这个对象是 ObservableObject
使用 @ObservedObject
Swift
struct ParentView: View {
@StateObject private var manager = GameManager.shared
var body: some View {
ChildView(gameManager: manager) // 作为参数传递
}
}
struct ChildView: View {
@ObservedObject var gameManager: GameManager // 从父视图接收
var body: some View {
Text(gameManager.gameState.rawValue)
}
}
特点:
✅ 会触发视图更新 当 @Published 属性变化时
❌ 可能被重新创建 如果父视图重建
适用于:从父视图传递下来的 ObservableObject
使用 @StateObject(推荐用于单例)
Swift
struct ContentView: View {
@StateObject private var gameManager = GameManager.shared
var body: some View {
Text(gameManager.gameState.rawValue) // ✅ 会自动更新
}
}
特点:
✅ 会触发视图更新
✅ 不会被意外重新创建 - SwiftUI 会保持同一个实例
✅ 生命周期与视图相同 - 但因为是单例,所以实际是全局的
最适合单例场景
