Sobes.tech
Junior — Middle

Jaki mechanizm dispatchu jest stosowany podczas wywoływania metody zdefiniowanej w protokole, który został rozszerzony za pomocą Extension?

sobes.tech AI

Odpowiedź od AI

W Swift, jeśli metoda jest zdefiniowana w protokole, a następnie protokół jest rozszerzony przez Extension z implementacją tej metody, to podczas wywołania metody przez odwołanie do protokołu używana jest statyczna dyspozycja (static dispatch). Oznacza to, że wywołanie metody zostanie skierowane do implementacji z rozszerzenia protokołu, a nie do implementacji w konkretnym typie, nawet jeśli typ ją nadpisuje.

Inaczej mówiąc, metody zaimplementowane w rozszerzeniach protokołów nie obsługują dyspozycji dynamicznej (dynamic dispatch), w przeciwieństwie do obowiązkowych metod protokołu zaimplementowanych w typach.

Przykład:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Domyślna implementacja w rozszerzeniu")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementacja w MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Wyświetli "Domyślna implementacja w rozszerzeniu"

To jest związane z tym, że metody z rozszerzeń protokołów nie są zawarte w tabeli wywołań wirtualnych (vtable) i są wywoływane bezpośrednio.