我有一个结构和一个类:
class FooClass {
var someValue: String = "123"
}
struct TestStruct {
var aValue: Int = 12
var clsValue: FooClass
}
我想要TestStruct的深层副本,但是以下代码也会更改变量a中的clsValue:
var a = TestStruct(aValue: 10, clsValue: FooClass())
var b = a
b.clsValue.someValue = "abc"
我知道结构中的类值仅复制为“引用”,但是当我将a分配给b时,我想对该类进行深层复制。
我确实知道c ++可以定义一个复制构造函数或重写=运算符。剂量迅速支持类似的东西吗?
答案 0 :(得分:1)
复制构造函数仅是一个初始化程序,该初始化程序接受另一个相同类型的实例。只需为您的类定义此类初始值设定项,并使用适当的深层副本进行构造即可。
class FooClass {
var someValue: String = "123"
init() {
}
init(someValue: String) {
self.someValue = someValue
}
// "Copy constructor"
convenience init(_ other: FooClass) {
self.init(someValue: other.someValue)
}
}
struct TestStruct {
var aValue: Int = 12
var clsValue: FooClass
init(aValue: Int, clsValue: FooClass) {
self.aValue = aValue
self.clsValue = FooClass(clsValue) // deep copy
}
// "Copy constructor"
init(_ other: TestStruct) {
self.init(aValue: other.aValue, clsValue: other.clsValue)
}
}
var a = TestStruct(aValue: 10, clsValue: FooClass())
var b = TestStruct(a) // create new instance with its deep copy
b.clsValue.someValue = "abc"
print(a.clsValue.someValue) // prints 123