Xcode12.0 Beta中如何通过初始化器参数初始化SwiftUI的@StateObject
如何在Xcode 12.0 Beta中用初始化参数初始化SwiftUI的@StateObject
在Xcode 12.0的首个Beta版本中,确实有办法实现用自定义初始化参数来初始化@StateObject,让当前视图成为对象的所有者——你遇到的编译错误,是因为直接在init中给@StateObject包装后的属性赋值,绕过了SwiftUI对@StateObject生命周期的管理机制。
为什么你的代码无法运行
@StateObject的核心设计就是让SwiftUI框架完全掌控对象的创建、持有和销毁过程,确保对象的生命周期和视图绑定。当你尝试在init中直接赋值self.myObject = MyObject(id: id)时,相当于手动创建了实例并绕过了框架的管理,这就触发了编译错误。
可行的解决方案
你可以直接初始化@StateObject的底层存储变量(也就是属性名前加下划线的那个),利用StateObject包装器的初始化方法传入参数创建实例。这样既满足了用初始化参数配置对象的需求,又让SwiftUI框架保持对对象生命周期的控制。
代码示例如下:
struct MyView: View { @StateObject private var myObject: MyObject init(id: Int) { // 直接初始化@StateObject的底层存储 self._myObject = StateObject(wrappedValue: MyObject(id: id)) } var body: some View { Text("Object ID: \(myObject.id)") } } class MyObject: ObservableObject { let id: Int init(id: Int) { self.id = id } }
方案优势
这个方法完美符合你想要的效果:
MyView成为了myObject的所有者,对象的生命周期和视图绑定- 不需要依赖父视图传递已初始化的实例,避免了
@ObservedObject带来的所有权转移问题 - 完全遵循SwiftUI的设计规范,不会出现生命周期管理的隐患
对比你的变通方案
你之前用@ObservedObject的方式,确实会让父视图成为对象的所有者,当前视图只是观察者。而上面的方案让当前视图完全掌控对象,当视图被销毁时,myObject也会被SwiftUI正确释放。
内容的提问来源于stack exchange,提问作者Emilio Schepis
相关产品推荐
相关产品推荐

