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