Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от AI

В Swift, ако метод е дефиниран в протокол и след това протоколът е разширен чрез Extension с реализацията на този метод, при извикване на метода чрез препратка към протокол се използва статическа диспетчеризация (static dispatch). Това означава, че извикването на метода ще бъде насочено към реализацията от разширението на протокола, а не към реализацията в конкретен тип, дори ако типът я препише.

С други думи, методите, реализирани в разширения на протоколи, не поддържат динамична диспетчеризация (dynamic dispatch), за разлика от задължителните методи на протокола, реализирани в типовете.

Пример:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Стандартна реализация в разширението")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Реализация в MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Ще изведе "Стандартна реализация в разширението"

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