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

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

最适合单例场景

相关推荐
iOS日常1 天前
Xcode 垃圾清理
ios·xcode
开心就好20251 天前
不越狱能抓到 HTTPS 吗?在未越狱 iPhone 上抓取 HTTPS
后端·ios
傅里叶1 天前
iOS相机权限获取
flutter·ios
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054962 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月2 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js