В чем разница между Witness Table и Virtual Table (vtable) в Swift?

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

Ответ

Witness Table (WT) и Virtual Table (VTable) — это механизмы диспетчеризации методов, но они служат разным целям и используются для разных типов.

Сравнительная таблица

Признак Witness Table (Таблица свидетелей) Virtual Table (Виртуальная таблица)
Для чего Диспетчеризация методов протоколов для типов значений (struct, enum) и классов. Диспетчеризация методов классов при наследовании и полиморфизме.
Типы Реализации протоколов (Protocol Witness Table - PWT). Иерархии классов.
Время создания Генерируется во время компиляции для каждого типа, реализующего протокол. Создается во время компиляции и хранится в метаданных класса.
Динамичность Статична для конкретного типа и протокола. Динамична: для экземпляра класса вызывается метод из таблицы его фактического (runtime) типа.
Основа Реализация требований протокола. Механизм наследования и переопределения методов.

Примеры

// 1. Witness Table для протокола
protocol Drawable {
    func draw()
}
struct Circle: Drawable {
    // Компилятор создает Witness Table для Circle, реализующего Drawable.
    func draw() { print("Drawing a circle") }
}
let shape: Drawable = Circle()
shape.draw() // Вызов через Witness Table для Circle -> Drawable

// 2. Virtual Table для классов
class Animal {
    func makeSound() { print("Some sound") } // Запись в vtable Animal
}
class Dog: Animal {
    override func makeSound() { print("Woof!") } // Запись в vtable Dog
}
let pet: Animal = Dog() // Статический тип Animal, динамический - Dog
pet.makeSound() // Вызов через vtable Dog -> выведет "Woof!"

Почему это важно:

  • Witness Tables позволяют типам значениям (struct) участвовать в полиморфизме через протоколы без накладных расходов наследования.
  • Virtual Tables — классический механизм ООП для поддержки наследования и переопределения методов в иерархиях классов.