知识卡片

扩展只能加行为不能加存储

专业/工作 · 755

内容

extension能给任何已有类型(包括标准库类型、甚至自己没有源码的第三方类型)追加计算属性、初始化方法、方法、协议遵从、嵌套类型,但明确不能添加存储属性。这个限制不是随意的:已经编译好、已经存在实例的类型有固定的内存布局,运行时到处都是这个类型大小固定的假设,如果扩展能加存储属性,就意味着同一个类型在不同地方大小可能不一样,会破坏整个类型系统的内存模型。因此扩展被限定为纯粹”追加行为”的机制——它能让一个类型事后满足某个协议(即”追溯式建模”:给一个你不拥有源码的类型补上你需要的接口,而不必改动原始定义),却不能让类型在你看不到的地方悄悄多出状态。发散:这也是为什么扩展成为组织代码的常用手段——把”某类型如何符合某协议”单独放进一个扩展块,接口实现和核心定义在源码里物理分开,一眼就能看出这段代码的职责边界。

参考来源

《Swift编程权威指南》第21章《扩展》