You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift技术疑问:两个视图中的类引用是否指向同一实例?

SwiftUI中两个View的Order实例是否共享?

嘿,这个问题刚好是SwiftUI状态管理里的常见坑!先给你明确结论:你代码里的order和myOrder是完全独立的两个Order类实例,并不是同一个对象。

为什么会这样?

因为你在每个View的属性声明里直接写了@ObservedObject var order = Order()和@ObservedObject var myOrder = Order()——这意味着每当ContentView和CheckoutView被初始化的时候,各自都会调用Order()的构造函数,生成一个全新的实例。两个实例之间没有任何关联,一个View修改了订单数据,另一个View完全感知不到变化。

怎么实现共享同一个实例?

如果想让两个View共享同一个Order实例,有两种常用的正确做法:

1. 手动传递实例(适合父子View关系)

让子View不要自己初始化Order,而是通过参数接收父View的实例:

// 修改CheckoutView的声明,去掉自己的初始化
struct CheckoutView: View {
    @ObservedObject var order: Order // 只声明类型,不初始化
    
    var body: some View {
        // 这里使用order实例即可
        Text("当前订单总价:\(order.total)")
    }
}

然后在ContentView跳转到CheckoutView的时候,把自己的order传过去:

struct ContentView: View {
    @ObservedObject var order = Order()
    
    var body: some View {
        NavigationStack {
            NavigationLink("前往结账") {
                CheckoutView(order: order) // 传递同一个实例
            }
        }
    }
}

2. 使用@EnvironmentObject(适合跨层级或全局共享)

如果你的View层级比较深,或者想让多个不直接关联的View共享实例,可以用环境对象:
首先在App的入口处注入Order实例:

@main
struct YourApp: App {
    let sharedOrder = Order() // 创建一个全局共享的实例
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(sharedOrder) // 注入到环境中
        }
    }
}

然后在两个View里直接从环境中获取这个共享实例:

struct ContentView: View {
    @EnvironmentObject var order: Order // 不需要初始化,自动从环境取
    // ...
}

struct CheckoutView: View {
    @EnvironmentObject var order: Order // 和ContentView用的是同一个实例
    // ...
}

这样不管在哪用@EnvironmentObject var order: Order,拿到的都是同一个sharedOrder实例,数据变化会在所有关联的View里同步更新。

内容的提问来源于stack exchange,提问作者MikeMaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:24:43