Может ли структура в swift иметь конструктор копирования - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть структура и класс:

class FooClass {
    var someValue: String = "123"
}
struct TestStruct {
    var aValue: Int = 12
    var clsValue: FooClass
}

И я хочу глубокую копию для TestStruct, но следующий код также изменит clsValue в переменной a:

var a = TestStruct(aValue: 10, clsValue: FooClass())
var b = a
b.clsValue.someValue = "abc"

Я знаю, что значение класса в структуре копируется только «ссылка», но я хочу глубокую копию для этого класса, когда я назначаю a для b.

Я знаю, что c ++ может определить конструктор копирования или переопределить =оператор.Доза Свифт поддержки что-то в этом роде?

1 Ответ

0 голосов
/ 25 февраля 2019

Конструктор копирования - это не что иное, как инициализатор, который принимает другой экземпляр того же типа.Просто определите такие инициализаторы для вашего класса и структурируйте соответствующие глубокие копии.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...