Что такое Witness Table в Swift?

«Что такое Witness Table в Swift?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 эффективно вызывать правильные методы при работе с протоколами.