Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : protocol, dispatch, witness, final

Если класс финализирован (final), но реализует метод протокола, какой тип диспетчеризации будет использоваться?

Вопрос проверяет знание особенностей вызова методов протокола для финальных классов в Swift.

Короткий ответ

Даже в final классе методы, реализующие требования протокола, могут вызываться через динамическую диспетчеризацию при работе с типом протокола. Однако компилятор Swift применяет оптимизацию и в большинстве случаев заменяет такие вызовы на статические, если тип известен на этапе компиляции.

Длинный ответ

Вызовы по протоколу:

  • Когда объект хранится в переменной типа протокола, Swift использует witness table для поиска реализации.

  • Это похоже на виртуальную таблицу, но для протоколов.

Влияние final:

  • final class гарантирует, что реализация не изменится.

  • Компилятор может внутренне оптимизировать и при прямом доступе по конкретному типу обойти witness table.

Сценарии:

  • Переменная конкретного типа: прямой вызов статически.

  • Переменная типа протокола: обычно вызов через witness table (динамически).

Пример:

protocol Greeter {
    	func greet()
}

final class EnglishGreeter: Greeter {
    	func greet() { print("Hello") }
}

let greeter: Greeter = EnglishGreeter()
greeter.greet() // через witness table

Вывод:
Для финальных классов Swift стремится к статической диспетчеризации, но при вызове через протокол остаётся использование механизма witness table.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Swift

    Swift

Ключевые слова

#protocol

#dispatch

#witness

#final

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.