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

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

最适合单例场景

相关推荐
天桥吴彦祖2 天前
判断iOS如何监听手机屏幕是否锁屏
ios
东坡肘子2 天前
SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142
人工智能·swiftui·swift
敲代码的鱼2 天前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹3 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
时光足迹3 天前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app
时光足迹3 天前
极光推送全攻略(下):uni-app 代码实现与 iOS 排查实战
vue.js·ios·uni-app
时光足迹3 天前
极光推送全攻略(上):被iOS证书折磨了三天,我写了一份前端也能看懂的避坑指南
前端·ios·uni-app
编程范式4 天前
SwiftUI 中图片如何适配可用空间
ios
songgeb6 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
东坡肘子9 天前
Swift 还让你 Excited 吗?-- 肘子的 Swift 周报 #141
人工智能·swiftui·swift