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

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

最适合单例场景

相关推荐
小羊没烦恼!13 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读14 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车15 小时前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁16 小时前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超16 小时前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int17 小时前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger18 小时前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
茶底世界之下18 小时前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_9160074719 小时前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
伞伞悦读19 小时前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json