В Swift, когда используется таблица виртуальных методов (Virtual Method Table или vtable)?

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

Ответ

Таблица виртуальных методов (vtable) используется Swift компилятором для реализации динамической диспетчеризации (dynamic dispatch) вызовов методов в иерархии классов.

Когда это происходит:

  • При вызове нефинализированного (non-final) метода на экземпляре класса, объявленном через тип его родителя (полиморфизм).
  • Когда метод может быть переопределён (override) в подклассе.

Пример:

class Animal {
    func makeSound() { print("Some sound") } // Попадёт в vtable
}

class Dog: Animal {
    override func makeSound() { print("Bark") } // Переопределяет запись в vtable
}

class Cat: Animal {
    override func makeSound() { print("Meow") } // Переопределяет запись в vtable
}

let animals: [Animal] = [Dog(), Cat()]
for animal in animals {
    animal.makeSound() // Динамический вызов через vtable: "Bark", "Meow"
}

Когда vtable НЕ используется (статическая диспетчеризация):

  1. Для final классов и методов.
  2. Для private методов, если они не могут быть переопределены.
  3. Для вызовов на конкретном типе (например, let dog = Dog(); dog.makeSound()), где компилятор может определить точный метод на этапе компиляции.
  4. Для структур (struct) и перечислений (enum), которые не поддерживают наследование.

Накладные расходы: Динамическая диспетчеризация добавляет один дополнительный шаг — косвенный вызов через указатель в таблице — что может незначительно влиять на производительность в критичных к скорости местах.