swift - 在组合的 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?
解决方案
推荐阅读
- python - 在表达式数据集python中删除值
- javascript - 为什么我的状态没有立即反映在反应中?
- karate - 如何使用空手道处理浏览器中的地理位置弹出窗口?
- react-native - 反应本机日期时间选择器选择
- mysql - Windows 10 上的 MySQL 8 - 时区
- c++ - 错误含义;以二进制形式打印数字
- reporting-services - 可以对 ssrs 组中的记录进行排名
- qt - QT 组合框的项目边框是通过 QAbstractItemView 的半径看到的
- vue.js - 如何在 vuejs 中获取复选框的状态是否已选中
- java - 登录android studio后尝试将用户重定向到新页面