Ответ
Witness Table (Таблица свидетелей) — это внутренний механизм Swift для реализации полиморфизма протоколов (Protocol Witness Table, PWT). Она связывает требования протокола с конкретными реализациями методов для каждого типа, реализующего этот протокол.
Как это работает?
Когда тип (структура, класс, перечисление) подписывается под протокол, компилятор для каждого метода протокола создает запись в Witness Table, указывающую на адрес реальной функции этого типа.
Пример:
protocol Drawable {
func draw()
}
struct Circle: Drawable {
// Компилятор добавляет указатель на эту реализацию в PWT для Circle
func draw() { print("Drawing a circle") }
}
struct Square: Drawable {
// Другая реализация — другой указатель в PWT для Square
func draw() { print("Drawing a square") }
}
let shapes: [Drawable] = [Circle(), Square()]
for shape in shapes {
// Во время выполнения система смотрит в Witness Table конкретного типа (Circle или Square)
// и вызывает правильную реализацию `draw()`.
shape.draw()
}
// Output:
// Drawing a circle
// Drawing a square
Ключевые особенности и преимущества:
- Для value-типов: Это основной механизм диспетчеризации методов протокола для структур и перечислений, который эффективнее полной динамической диспетчеризации Objective-C (через
objc_msgSend). - Статическая типизация: Таблицы создаются на этапе компиляции, что дает оптимизацию производительности.
- Отличие от V-Table (Virtual Dispatch): Классы в Swift используют виртуальные таблицы (v-table) для наследования. Witness Tables используются именно для полиморфизма через протоколы.
Итог: Witness Table — это оптимизированная «карта», позволяющая Swift эффективно вызывать правильные методы при работе с протоколами.