Witness Table 的由来

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

1. 术语来源

"Witness"

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

"Table"

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

2. Witness Table 的作用

证明类型实现了协议

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

支持动态分派

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

3. 工作原理

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

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

动态分派:
swift 复制代码
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 Table 是 Swift 编译器生成的数据结构,用于确保类型实现了其遵循的协议,并支持协议的动态分派。名称中的 "Witness" 表示对协议实现的证明,而 "Table" 表示这种证明的组织结构。通过 Witness Table,Swift 能够在保持高效的同时,实现灵活的协议调用和类型检查。

相关推荐
权咚7 小时前
阿权的开发经验小集
git·ios·xcode
用户097 小时前
TipKit与CloudKit同步完全指南
ios·swift
法的空间13 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_9159184114 小时前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张16 小时前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview
东坡肘子16 小时前
完成 Liquid Glass 的适配了吗?| 肘子的 Swift 周报 #0102
swiftui·swift·apple
Magnetic_h1 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
00后程序员张1 天前
详细解析苹果iOS应用上架到App Store的完整步骤与指南
android·ios·小程序·https·uni-app·iphone·webview
前端小超超1 天前
capacitor配置ios应用图标不同尺寸
ios·蓝桥杯·cocoa
2501_915106321 天前
Xcode 上传 ipa 全流程详解 App Store 上架流程、uni-app 生成 ipa 文件上传与审核指南
android·macos·ios·小程序·uni-app·iphone·xcode