Какая диспетчеризация методов в Swift самая быстрая и почему?

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

Ответ

Самая быстрая диспетчеризация в Swift — статическая (прямая).

Принцип работы: Компилятор определяет точный адрес вызываемой функции на этапе компиляции. При выполнении программы процессору передается прямой вызов по этому адресу, без каких-либо дополнительных поисков.

Где используется:

  • Глобальные функции.
  • static и final методы.
  • Методы struct и enum (по умолчанию, если метод не помечен как mutating и не вызывает другие методы).

Пример статической диспетчеризации:

struct Point {
    var x, y: Int
    // Компилятор использует статическую диспетчеризацию
    func distance(to other: Point) -> Double {
        let deltaX = Double(x - other.x)
        let deltaY = Double(y - other.y)
        return sqrt(deltaX * deltaX + deltaY * deltaY)
    }
}

let p1 = Point(x: 0, y: 0)
let p2 = Point(x: 3, y: 4)
let d = p1.distance(to: p2) // Вызов напрямую известен компилятору

Сравнение с другими типами:

  1. Статическая: Самый быстрый вариант. Нет накладных расходов во время выполнения.
  2. Динамическая (через vtable): Используется для методов class. Требует поиска в таблице виртуальных методов (vtable), что немного медленнее.
  3. Диспетчеризация протоколов (witness table): Используется для вызовов через protocol. Аналогично динамической, но через свою таблицу.

Оптимизация: Для классов используйте модификаторы final и private, чтобы компилятор мог применить статическую диспетчеризацию.