Скажем (просто в качестве примера) у меня есть класс Человек и структура дом:
class Person {
var name: String
var lastName: String
init(name: String, lastName: String) {
self.name = name
self.lastName = lastName
}
}
struct House {
var address: String
var squareMeters: Float
var owner: Person
init(withAddress address: String, squareMeters: Float, andOwner owner: Person) {
self.address = address
self.squareMeters = squareMeters
self.owner = owner
}
}
В этом случае довольно просто сохранить семантику значений в дом, если я не ошибаюсь, я могу просто сделать что-то вроде:
struct House {
var address: String
var squareMeters: Float
private var owner: Person //owner is now private
init(withAddress address: String, squareMeters: Float, andOwner owner: Person) {
self.address = address
self.squareMeters = squareMeters
//init now creates a copy of the owner passed
self.owner = Person(name: owner.name, lastName: owner.lastName)
}
//every time the owner gets modified from the outside we make sure to create a copy if needed
private var ownerToWrite: Person {
mutating get {
if !isKnownUniquelyReferenced(&owner) {
owner = Person(name: owner.name, lastName: owner.lastName)
}
return owner
}
}
var ownerName: String {
get {
return owner.name
}
mutating set {
ownerToWrite.name = newValue
}
}
var ownerLastName: String {
get {
return owner.name
}
mutating set {
return ownerToWrite.lastName = newValue
}
}
}
Хорошо, это должно сработать. Но что, если дом содержит множество из Человек? Например:
struct House {
var address: String
var squareMeters: Float
var tenants: [Person]
init(withAddress address: String, squareMeters: Float, andTenants tenants: [Person]) {
self.address = address
self.squareMeters = squareMeters
self.tenants = tenants
}
}
Как мне сохранить семантику значений в новой структуре дом? Заранее спасибо.
Нет, меня "беспокоит" (и, вероятно, я должен уточнить вопрос) вот что: кто-то может получить доступ, например, к арендаторам [3] и изменить его без фактического копирования и воссоздания Дома, и это неправильно. Это не соответствовало бы семантике значения структуры (проверьте пример, который я написал здесь выше, с «владельцем» вместо «арендаторов». Каждый раз, когда владелец изменяется, мы создаем нового владельца для поддержания семантики значения Дома).