知识卡片

mutating 方法是值类型默认不可变的例外声明

专业/工作 · 718

内容

结构体和枚举的实例方法默认不能修改 self 或自身的属性,这和 [[类和结构体的根本分野是值语义与引用语义]] 里”值类型改动只发生在自己的副本上”是同一套逻辑在方法层面的延伸:编译器把方法体也当成对这份数据的一次只读访问,除非显式在方法前加 mutating 关键字声明”这个方法会替换/修改 self”。类的实例方法则没有这个限制,因为类是引用类型,修改本来就是在改同一份共享的实例。这种”默认只读、显式声明例外”的设计让读者只看方法签名就能判断调用一个值类型的方法会不会改变自己持有的这份数据,不用去翻方法体实现。

参考来源

《Swift全解析:新式iOS实战开发》第12章《Swift方法》