Sobes.tech
Назад к вопросам
Junior — Middle
83

Какой механизм диспетчеризации применяется при вызове метода, определенного в протоколе, который был расширен при помощи Extension?

Ответ от нейросети

sobes.tech AI

В Swift, если метод определён в протоколе, а затем протокол расширен через Extension с реализацией этого метода, то при вызове метода через ссылку на протокол используется статическая диспетчеризация (static dispatch). Это означает, что вызов метода будет направлен на реализацию из расширения протокола, а не на реализацию в конкретном типе, даже если тип её переопределяет.

Другими словами, методы, реализованные в расширениях протоколов, не поддерживают динамическую диспетчеризацию (dynamic dispatch), в отличие от обязательных методов протокола, реализованных в типах.

Пример:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Default implementation in extension")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementation in MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Выведет "Default implementation in extension"

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