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.