Swift页面间数据模型共享问题:如何实现ClassA与ClassB共享可双向编辑的DataModel并同步更新值
解决ClassA与ClassB共享可编辑DataModel的问题
这问题我太懂了!你现在遇到的核心问题有两个:一是值类型的拷贝特性,二是代码里的初始化顺序错误,咱们逐个解决:
问题根源拆解
- 值类型导致数据不共享:你定义的
DataModel是struct,Swift里struct是值类型,当你把它传给ClassB的初始化方法时,会自动创建一个副本。这意味着ClassA和ClassB手里的dataModel是完全独立的两个对象,修改任何一边都不会影响另一边。 - 初始化顺序错误:在ClassA里,你先创建了ClassB实例,之后才给
dataModel.firstName赋值为"ABC"——所以ClassB初始化时拿到的是还没赋值的空DataModel,打印自然为空。
修改方案
方案一:把DataModel改为引用类型(Class)
这是最直接的方案,因为Swift的class是引用类型,传递的是实例的引用,两个类会共享同一份数据:
// 把struct改成class class DataModel { var firstName: String = "" var lastName: String = "" } class ClassA { var dataModel: DataModel // 先初始化自己的dataModel,再创建ClassB init() { dataModel = DataModel() let classB = ClassB(dataModel: dataModel) dataModel.firstName = "ABC" // 此时ClassB的dataModel.firstName也会变成"ABC" } } class ClassB { var dataModel: DataModel init(dataModel: DataModel) { self.dataModel = dataModel // 现在如果ClassA已经赋值,这里就能拿到对应的值;后续ClassA修改,这里也会同步 print(dataModel.firstName) } }
方案二:如果坚持用Struct(SwiftUI场景)
如果你是在SwiftUI环境下,可以用@Binding或者ObservableObject来实现数据共享:
- 用
ObservableObject+@Published:
import Combine class DataViewModel: ObservableObject { @Published var dataModel: DataModel = DataModel() } struct DataModel { var firstName: String = "" var lastName: String = "" } class ClassA { let viewModel: DataViewModel init(viewModel: DataViewModel) { self.viewModel = viewModel let classB = ClassB(viewModel: viewModel) viewModel.dataModel.firstName = "ABC" } } class ClassB { let viewModel: DataViewModel init(viewModel: DataViewModel) { self.viewModel = viewModel print(viewModel.dataModel.firstName) // 后续ClassA修改viewModel.dataModel,ClassB也能通过监听Published事件获取变化 } }
验证效果
修改后,不管是ClassA还是ClassB修改dataModel的属性,另一个类里的对应属性都会同步更新,完全符合你“共享同一份可编辑数据”的需求。
内容的提问来源于stack exchange,提问作者wong john
相关产品推荐
相关产品推荐

