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

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

最适合单例场景

相关推荐
nice_lcj5201 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵3 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy13 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++
不积跬步无以至千里mmbb265 小时前
rust_analysis
开发语言·后端·rust
暴力求解5 小时前
C++ ---继承(二)
开发语言·c++·算法
陈飞EXCEL5 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习
代龙涛6 小时前
WordPress Query 查询机制详解(WP_Query)
开发语言·后端·php·wordpress
znsoft6 小时前
MaClaw(码卡龙)技术拆解:一个 Go + React 的可自进化智能体平台
开发语言·react.js·golang
凉茶钱8 小时前
红黑树:用“颜色”换“平衡”,set 与 map 的底层发动机
开发语言·c++·红黑树
高冷小鱼殿下8 小时前
内部类Lambda与枚举
java·开发语言