Какие типы диспетчеризации методов поддерживает класс в Swift?

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

Ответ

Классы в Swift поддерживают три типа диспетчеризации:

Тип Механизм Использование Производительность
Static (Direct) Dispatch Вызов метода разрешается на этапе компиляции. final методы и классы, static методы, private методы (в некоторых случаях). Наивысшая. Нет накладных расходов времени выполнения.
Table (Dynamic) Dispatch Вызов метода разрешается через поиск в таблице виртуальных методов (vtable). Обычные нефинальные методы и классы. Средняя. Требуется косвенный вызов через таблицу.
Message Dispatch Вызов метода разрешается во время выполнения через механизм Objective-C runtime. Методы, помеченные @objc или dynamic, наследование от NSObject. Наименьшая. Позволяет использовать method swizzling и KVO.

Примеры:

// 1. Static Dispatch
final class MyFinalClass {
    func method() {} // Статическая диспетчеризация
}

// 2. Table Dispatch
class BaseClass {
    func method() {} // Динамическая диспетчеризация через vtable
}

// 3. Message Dispatch
class ObjCClass: NSObject {
    @objc dynamic func method() {} // Диспетчеризация через Objective-C runtime
}

Компилятор Swift агрессивно оптимизирует код, стараясь использовать статическую диспетчеризацию везде, где это возможно, для повышения производительности.