【发布时间】:2017-04-21 14:13:48
【问题描述】:
我在 swift 3 中克隆对象时遇到问题。我想复制/克隆一个对象,然后想修改它的值,以便修改不会反映在实际对象上。这就是我所做的。
let patientInformation = PatientInformationController.shared().pateintInformation.copy() as! PateintInformation
patientInformation.firstName = "Some Name"
上面这行其实不仅仅是修改了本地副本,还影响了实际的 PatientInformationController.shared().pateintInformation.firstName PateintInformation 符合 NSCopying 协议。
我检查了两个对象(实际和副本)的内存地址,它们是不同的。
在 PatientInformation 类中:
required public init(instance: PateintInformation) {
self.firstName = instance.firstName
}
public func copy(with zone: NSZone? = nil) -> Any {
return PateintInformation(instance: self)
}
【问题讨论】:
-
如果
PatientInformationController.shared().pateintInformation和patientInformation确实引用了两个不同的对象实例,那么设置patientInformation的firstName不能同时改变PatientInformationController.shared().pateintInformation的firstName。 -
复制效果如何?你的代码是什么?你检查了
firstName每个属性的地址吗? -
我已经实现了 NSCopying 协议的 copyWithZone:。
-
@A.Sen firstName 是 String 类型吗?
-
@EugeneLaminskiy 是的。
标签: ios swift clone deep-copy nscopying