Witness Table 的由来

news/2024/7/8 7:42:56 标签: Witness Table, Swift, iOS

Witness Table” 是 Swift 中的一个术语,源于编译原理和类型系统的概念。它被用来表示一种机制,通过这个机制,编译器可以确保某个类型确实实现了它声明遵循的协议中的所有方法和属性。下面是对这个术语的详细解释:

1. 术语来源

“Witness”

  • 在英语中,“witness” 意为见证或证人。在编译器和类型系统中,“witness” 表示某种形式的证明或证据,证明某个类型确实遵循了特定的协议。

“Table”

  • 表示一种数据结构,用于存储和查找信息。在这里,“table” 用来存储某个类型对协议中各个方法和属性的具体实现。

2. Witness Table 的作用

证明类型实现了协议

  • Witness Table 是编译器生成的一个数据结构,其中包含了某个类型对其所遵循协议的所有方法和属性的具体实现。这就像是一个“证人”,证明这个类型确实实现了协议的所有要求。

支持动态分派

  • 在运行时,当通过协议类型调用方法时,Swift 使用 Witness Table 查找具体的实现。这种机制支持协议的动态分派,使得编译时的类型检查和运行时的类型实现得以结合。

3. 工作原理

协议定义:
protocol MyProtocol {
    func doSomething()
}
类型遵循协议:
class MyClass: MyProtocol {
    func doSomething() {
        print("MyClass implementation of doSomething")
    }
}

编译器在编译 MyClass 时,会生成一个 Witness Table,其中记录了 MyClassMyProtocol 中所有方法的实现地址。

动态分派:
let object: MyProtocol = MyClass()
object.doSomething()

在运行时,object.doSomething() 调用会通过 Witness Table 找到 MyClassdoSomething() 实现并执行。

4. 示例解释

为了更好地理解 Witness Table 的作用,我们可以将其与虚表(V-Table)进行对比:

虚表(V-Table)

  • 用于类的继承和多态。
  • 每个类都有一个虚表,存储该类及其继承链中的虚方法指针。

Witness Table

  • 用于协议的动态分派。
  • 每个遵循协议的类型都有一个 Witness Table,存储该类型对协议中方法和属性的具体实现。

5. 名称背后的逻辑

“Witness”

  • 每个条目都是对协议实现的证明,就像证人提供的证词,确保类型满足协议的契约。

“Table”

  • 用于存储和快速查找信息,确保在运行时可以高效地找到类型对协议方法的实现。

总结

Witness TableSwift 编译器生成的数据结构,用于确保类型实现了其遵循的协议,并支持协议的动态分派。名称中的 “Witness” 表示对协议实现的证明,而 “Table” 表示这种证明的组织结构。通过 Witness TableSwift 能够在保持高效的同时,实现灵活的协议调用和类型检查。


http://www.niftyadmin.cn/n/5536800.html

相关文章

大数据处理引擎选型之 Hadoop vs Spark vs Flink

随着大数据时代的到来,处理海量数据成为了各个领域的关键挑战之一。为了应对这一挑战,多个大数据处理框架被开发出来,其中最知名的包括Hadoop、Spark和Flink。本文将对这三个大数据处理框架进行比较,以及在不同场景下的选择考虑。…

Linux基础 - 常用命令

目录 零. 简介 一 . 常见 Ubuntu 命令 二. apt-get 下载 三. 网络命令 四. 常用命令的总结 零. 简介 在 Ubuntu 中,命令是用于与操作系统进行交互和执行各种操作的指令。通过在终端中输入命令,可以完成文件管理、系统配置、软件安装、进程管理等各种…

Kafka搭建(单机版)

部署前提 VMware环境 : 两台centos系统 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度网盘自取: 链接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取码: e32t Kafka搭建(…

docker安装elasticesarch-head

安装 Elasticsearch-Head 通常涉及以下步骤: 拉取 Elasticsearch-Head 的 Docker 镜像。 运行 Elasticsearch-Head 容器并连接到 Elasticsearch 实例。 以下是具体的命令: 拉取 Elasticsearch-Head 的 Docker 镜像 docker pull mobz/elasticsearch-…

Java中的网络安全与防护策略

Java中的网络安全与防护策略 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当今信息化时代,网络安全问题日益突出,尤其对于Java开发者来说,保障应用程序和数据…

500mA、低压差、低噪声、超快、无需旁路电容的CMOS LDO稳压器RT9013

一般描述 RT9013 SOT23-5封装的外观和丝印 RT9013 是一款高性能的 500mA LDO 稳压器,具有极高的 PSRR 和超低压差。非常适合具有苛刻性能和空间要求的便携式射频和无线应用。 RT9013的静态电流低至25μA,进一步延长了电池的使用寿命。RT9013 也适用于低…

PID算法介绍以及代码实现过程说明

写在正文之前 在上一篇文章就说会在这两天会基于PID写一个文章,这里的原理部分值得大家都看一下,代码部分的实现是基于python的,但是对于使用其他编程语言的朋友,由于我写的很通俗易懂,所以也值得借鉴。 一、PID算法…

element Input 输入框 输入长度限制 maxlength=“10“默认输入长度提示颜色为红色

对于el-input&#xff0c;直接显示输入长度提示并上色并不直接支持&#xff0c;但我们可以用一些技巧来模拟这一效果。而对于el-textarea&#xff0c;虽然它没有直接的计数提示&#xff0c;但可以通过类似的技巧添加。 对于el-input <template><div class"inpu…