Swift中的结构可以具有复制构造函数吗

时间:2019-02-25 03:30:14

标签: swift

我有一个结构和一个类:

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 ++可以定义一个复制构造函数或重写=运算符。剂量迅速支持类似的东西吗?

1 个答案:

答案 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