Какой тип диспетчеризации методов используется для Reference types (классов) в Swift?

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

Ответ

Reference types (классы) в Swift по умолчанию используют динамическую диспетчеризацию (dynamic dispatch).

Как это работает:

  • Компилятор создает для каждого класса таблицу виртуальных методов (vtable).
  • Во время выполнения система смотрит на фактический тип объекта (а не тип переменной) и выбирает реализацию метода из соответствующей таблицы.
  • Это основа полиморфизма: позволяет переопределять методы в подклассах.

Пример:

class Vehicle {
    func description() { print("Это транспортное средство") }
}

class Car: Vehicle {
    override func description() { print("Это автомобиль") }
}

let myVehicle: Vehicle = Car()
myVehicle.description() // Выведет "Это автомобиль" (динамический вызов)

Исключения и оптимизации:

  • Методы и классы, помеченные ключевым словом final, используют статическую диспетчеризацию. Компилятор определяет вызов на этапе компиляции, что повышает производительность.
  • Методы с атрибутом @objc диспетчеризуются через механизм message passing Objective-C runtime.