Ответ
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.