swift中使用ObservableObject单利模式的时候,用let 或 @ObservedObject 或 @StateObject 有什么区别

使用 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 会保持同一个实例

✅ 生命周期与视图相同 - 但因为是单例,所以实际是全局的

最适合单例场景

相关推荐
方璧17 小时前
限流的算法
java·开发语言
Hi_kenyon18 小时前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
曲莫终18 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
ghie909018 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng18 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
吴声子夜歌19 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
wanglei20070820 小时前
生产者消费者
开发语言·python
leo__52020 小时前
基于菲涅耳衍射积分的空心高斯光束传输数值模拟(MATLAB实现)
开发语言·matlab
昵称已被吞噬~‘(*@﹏@*)’~20 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战