Sobes.tech
Junior — Middle

Aký mechanizmus dispatchu sa používa pri volaní metódy definovanej v protokole, ktorý bol rozšírený pomocou Extension?

sobes.tech AI

Odpoveď od AI

V Swift, ak je metóda definovaná v protokole a následne je protokol rozšírený pomocou Extension s implementáciou tejto metódy, pri volaní metódy cez odkaz na protokol sa používa statická dispatch (static dispatch). To znamená, že volanie metódy bude smerované na implementáciu z rozšírenia protokolu, a nie na implementáciu v konkrétnom type, aj keď ho typ prepíše.

Inými slovami, metódy implementované v rozšíreniach protokolov nepodporujú dynamickú dispatch (dynamic dispatch), na rozdiel od povinných metód protokolu implementovaných v typoch.

Príklad:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Predvolená implementácia v rozšírení")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementácia v MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Vytlačí "Predvolená implementácia v rozšírení"

Toto je spôsobené tým, že metódy z rozšírení protokolov nie sú zahrnuté v tabuľke virtuálnych volaní (vtable) a sú volané priamo.