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

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

Ответ

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

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

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

Пример:

struct Point {
    var x, y: Double
    func coordinates() -> String { return "(x: (x), y: (y))" }
}

let p = Point(x: 10, y: 20)
print(p.coordinates()) // Компилятор напрямую вставляет вызов метода `Point.coordinates()`

Важное исключение:

  • Если метод value type помечен как @objc dynamic (например, для совместимости с KVO), к нему будет применена динамическая диспетчеризация через Objective-C runtime.
  • Вызов методов через протокол (протокольно-ориентированный полиморфизм) также использует механизм witness table, который является формой динамической диспетчеризации, но оптимизированной для value types.