Какой тип диспетчеризации используется при объявлении класса как final в Swift?

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

Ответ

Для класса, помеченного как final, компилятор Swift использует статическую диспетчеризацию (раннее связывание) вместо динамической. Это происходит потому, что final гарантирует отсутствие подклассов, делая невозможным переопределение методов.

Почему это важно:

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

Пример:

final class NetworkService {
    func fetchData() {
        print("Fetching data...")
    }
}

let service = NetworkService()
service.fetchData() // Вызов разрешается статически во время компиляции

Ключевые аспекты:

  • final запрещает наследование от класса.
  • Все методы и свойства класса неявно становятся final.
  • Рекомендуется использовать final для классов, которые не предназначены для наследования, чтобы улучшить производительность и явно выразить дизайн.