Вопрос проверяет глубокое понимание того, как Swift вызывает методы и почему одни вызовы быстрее других.
Static dispatch означает, что адрес вызываемого метода известен на этапе компиляции. Dynamic dispatch определяется в runtime и используется при наследовании и полиморфизме. Static dispatch быстрее и лучше оптимизируется, dynamic — гибче, но дороже. Swift использует оба подхода в зависимости от контекста.
Dispatch — это механизм, который определяет, какая реализация метода будет вызвана.
Static dispatch — выбор метода на этапе компиляции
Dynamic dispatch — выбор метода во время выполнения программы
Используется, когда компилятор точно знает реализацию метода.
Типичные случаи:
struct и enum
final-классы
private / fileprivate методы
вызовы через конкретный тип
Преимущества:
быстрый вызов
возможность inline
меньше runtime-накладных расходов
Используется, когда возможны разные реализации.
Типичные случаи:
обычные классы
методы, которые могут быть переопределены
вызовы через протоколы (existential)
Механизм:
таблицы виртуальных методов
косвенные переходы
Важно различать:
generic + protocol constraint → чаще static
existential (any Protocol) → dynamic
Понимание dispatch помогает:
писать более предсказуемый код
оптимизировать горячие участки
осознанно использовать final и generics
Static dispatch — про скорость и оптимизации, dynamic dispatch — про гибкость и полиморфизм. Swift выбирает механизм автоматически, но разработчик может влиять на этот выбор.