Что такое Direct Dispatch в Swift?

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

Ответ

Direct Dispatch (Статическая диспетчеризация) — это самый быстрый механизм вызова метода, при котором адрес функции известен во время компиляции. Компилятор подставляет прямой вызов или даже инлайнит код, минуя поиск по таблицам.

Когда компилятор Swift использует Direct Dispatch:

  • Для всех вызовов глобальных функций.
  • Для методов и свойств, объявленных как final.
  • Для методов в struct и enum (так как они не поддерживают наследование).
  • Для методов, помеченных как private или fileprivate в классе, если компилятор может доказать, что они не переопределяются.
  • Для static методов и свойств.

Пример:

final class NetworkService { // final класс не может иметь наследников
    func sendRequest() { // Этот метод будет диспетчеризован напрямую
        print("Sending request...")
    }
}

struct Calculator { // Структуры всегда используют direct dispatch
    func add(_ a: Int, _ b: Int) -> Int { return a + b }
}

let service = NetworkService()
service.sendRequest() // Direct Dispatch: вызов происходит напрямую

let calc = Calculator()
calc.add(5, 3) // Direct Dispatch
Сравнение с другими типами диспетчеризации: Тип Скорость Динамичность Пример в Swift
Direct ⚡️ Самый быстрый Нет final методы, struct
Table (Virtual) Быстрая Да (наследование) Обычные методы класса
Message Медленнее Максимальная (KVO, swizzling) Методы, унаследованные от NSObject

Преимущества Direct Dispatch:

  • Максимальная производительность: Нет накладных расходов на поиск в таблице виртуальных функций.
  • Возможности оптимизации: Компилятор может применить инлайнинг и другие агрессивные оптимизации.

Недостаток:

  • Отсутствие полиморфизма — метод не может быть переопределен в подклассе (что и является целью final).