代码之家  ›  专栏  ›  技术社区  ›  superpuccio Kasra

在结构上保留值语义(包含引用类型数组)

  •  0
  • superpuccio Kasra  · 技术社区  · 7 年前

    比如说我有一门课 和一个结构 房子 :

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

    如何在新的 房子 结构?提前谢谢你。

    0 回复  |  直到 7 年前