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
相关产品推荐
相关产品推荐

