协议之外

考虑一下协议。 我们在应用程序中广泛使用它们来委派操作,支持多重继承概念并在引用和值类型上创建复合功能。 更进一步,我们可以通过使类和类型定义符合协议来扩展它们。 我们可以定义协议类型变量并使我们的类型更灵活(不包括关联类型和自我需求协议)。

每个(不透明的)容器在内存中都有3个部分:

  • 三个存储字的长度缓冲区,用于保存Value :如果值的大小大于3个字,则将其存储在堆中,并且地址保存在此处。
  MemoryLayout.size(ofValue:alice)// 32字节 
//因此将其存储在堆中,并将其地址保存在值缓冲区中
  • 一个记忆词表示“ 元数据
  • 每种协议类型都有一个存储字,用于存储“ 协议见证表 。 如果您的变量由N个不同的协议组成,则将其计算为N个存储字。

对于* protocol的声明*中的每个方法,都有一个指向其符合类型的实现的指针。 因此,当您在协议扩展中定义一个方法时,该方法将不会出现在见证表中,并且在您的变量上使用该方法时,它会被静态分派,并返回其默认实现,如上面的示例。

如果您想要重写的实现,则只需将其添加到协议声明部分,即可按预期工作😊