> Что будет выведено при вызове метода из экстеншена класса и протокола в Swift (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: 2GIS

Стек: iOS, Swift

> Пример ответа

При вызове метода из экстеншена класса и протокола в Swift результат зависит от того, как объявлен метод: статически или динамически.

Если метод объявлен только в экстеншене протокола (без указания в основном объявлении протокола), то он вызывается статически на основе типа переменной (compile-time dispatch). Если метод объявлен в самом протоколе (как требование), то вызывается динамически на основе реального типа объекта (runtime dispatch).

Пример:

SWIFT
protocol MyProtocol {
func dynamicMethod() // объявлен в протоколе
}
extension MyProtocol {
func dynamicMethod() { print("Протокол: dynamicMethod") }
func staticMethod() { print("Протокол: staticMethod") } // только в экстеншене
}
class MyClass: MyProtocol {
func dynamicMethod() { print("Класс: dynamicMethod") }
func staticMethod() { print("Класс: staticMethod") }
}
let obj: MyProtocol = MyClass()
obj.dynamicMethod() // Вывод: "Класс: dynamicMethod" (динамическая диспетчеризация)
obj.staticMethod() // Вывод: "Протокол: staticMethod" (статическая диспетчеризация)

Таким образом, при вызове метода из экстеншена протокола (без объявления в протоколе) будет вызвана реализация из экстеншена, даже если класс имеет свою версию. А при вызове метода, объявленного в протоколе, будет вызвана реализация класса.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью