首页 > 解决方案 > 在组合的 Swift 结构中复制行为

问题描述

// definition: Company: { Member { [Activity { times: Int }] }
struct Company {
    var bossId: Int = 0
    var members: [Int: Member] = [:]
    var boss: Member? { 
        get { return members[bossId] }
        set { members[bossId] = newValue }
    }
}

struct Member {
    var name: String
    var activities: [Activity]
}

struct Activity {
    var type: String
    var times: Int
}

// init
var company = Company()
company.members[0] = Member(name: "John",activities: [Activity(type: "Walk", times: 0)])
company.members[1] = Member(name: "Sean", activities: [Activity(type: "Run", times: 0)])

我的顶层结构中有一个计算属性,boss返回成员之一id。当我想更新一些叶子成员的属性时,编译器抱怨它需要一个 setter。所以我members[bossId] = newValue为它添加了一个setter。似乎当 value 发生变化时,它会分配一个新的 updatedMember来替换 original Member,因为它struct不是class.

boss: Member即使我只需要更新int成员的一个属性,它是否会导致整个结构副本?

我应该担心这个多余的副本吗?或者编译器足够聪明以最小化影响?

// use
company.boss?.activities[0].times = 1 
company.boss?.activities[0].times = 2
company.boss?.activities[0].times = 3 // <- Does it cause 3 times whole `Member` copy? 

标签: swift

解决方案


推荐阅读