Swift 4 停止引用模型及编辑页数据回退保存问题咨询
嘿,我来帮你搞定这两个Swift里的引用相关问题~
1. 如何在Swift 4中停止引用模型?
在Swift里,类是引用类型,而结构体/枚举是值类型——这是核心区别。如果你的模型是类,赋值给另一个变量时,两个变量会指向同一个内存实例,自然会同步变更。要打破这种引用关系,有两种实用方案:
方案一:把模型改成结构体
结构体默认是值语义,赋值时会自动创建完整的独立副本,两个变量完全互不影响:
// 把原来的类模型改成结构体 struct User { var name: String var age: Int } // 使用时,赋值就是拷贝操作 let originalUser = User(name: "Paresh", age: 30) let demoUser = originalUser // 这里是独立副本,修改其中一个不会影响另一个
方案二:给类模型实现拷贝方法
如果因为业务逻辑不能改成结构体,那可以手动给类加一个拷贝方法,创建新的类实例并复制所有属性:
class User { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } // 实现拷贝方法,生成独立实例 func copy() -> User { return User(name: self.name, age: self.age) } } // 使用时调用copy()获取独立实例 let originalUser = User(name: "Paresh", age: 30) let demoUser = originalUser.copy() // 现在demoUser是全新实例,和originalUser互不干扰
2. 编辑页面修改模型后,演示模型同步变更的解决办法
你的问题本质还是引用类型的锅:你把原模型直接赋值给演示模型,两者指向同一个内存实例,所以编辑页修改原模型时,演示模型自然会跟着变。解决思路和上面一致,只需要在赋值演示模型时,使用独立副本而非原引用:
具体操作建议
- 当你需要创建演示模型时,不要直接写
let demoModel = originalModel,而是用上面的拷贝方法(类模型),或者直接赋值(结构体模型),确保演示模型是独立的。 - 如果希望编辑页修改时不影响原模型,可以在进入编辑页前,先把原模型的副本传给编辑页,用户修改完成后,再按需把修改后的副本同步回原模型:
// 进入编辑页前,创建原模型的副本 let editModel = originalModel.copy() // 把editModel传给编辑页,用户修改的是这个副本 // 编辑完成后,如果需要保存更改,再同步回原模型 originalModel.name = editModel.name originalModel.age = editModel.age
这样一来,演示模型是原模型的独立副本,编辑操作不会直接影响它,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Paresh. P
相关产品推荐
相关产品推荐

