Сохранять семантику значений в структурах (содержащих массив ссылочных типов) - PullRequest
0 голосов
/ 18 декабря 2018

Допустим (в качестве примера) у меня есть класс Person и структура House :

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
    }
}

Как сохранить семантику значений в новой структуре House ?Заранее спасибо.

...