知识卡片
值类型修改属性的本质是替换
内容
[[值类型与引用类型的本质区别|值类型]]的实例方法默认不能修改自身属性,必须用 mutating 关键字显式标记方法才允许这样做;而这个操作在原理上等价于用新的属性值重新构造一个完整 实例,再整体替换掉原来的实例,而不是像引用类型那样在原地修改某个字段。发散:这解释了 为什么值类型天生没有”部分修改导致对象处于不一致中间状态”的风险——每次”修改”都是生成一个 全新的、内部一致的整体,不存在只改了一半字段的过渡态;也解释了为什么用 let 声明的值类型 变量完全不能调用 mutating 方法,因为整体替换动作本身就是一次赋值,而常量不允许被重新 赋值。
参考来源
《Swift 4从零到精通iOS开发》第8章《属性与方法》