Junior — Middle
Jaký mechanismus dispatch se používá při volání metody definované v protokolu, který byl rozšířen pomocí Extension?
sobes.tech AI
Odpověď od AI
Ve Swiftu, pokud je metoda definována v protokolu a poté je protokol rozšířen pomocí Extension s implementací této metody, pak při volání metody přes odkaz na protokol se používá statická dispatch (static dispatch). To znamená, že volání metody bude směřovat na implementaci z rozšíření protokolu, nikoliv na implementaci v konkrétním typu, i když jej typ přepisuje.
Jinými slovy, metody implementované v rozšířeních protokolů nepodporují dynamickou dispatch (dynamic dispatch), na rozdíl od povinných metod protokolu implementovaných v typech.
Příklad:
protocol MyProtocol {
func requiredMethod()
}
extension MyProtocol {
func requiredMethod() {
print("Výchozí implementace v rozšíření")
}
}
struct MyStruct: MyProtocol {
func requiredMethod() {
print("Implementace v MyStruct")
}
}
let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Vytiskne "Výchozí implementace v rozšíření"
To je způsobeno tím, že metody z rozšíření protokolů nejsou zahrnuty do tabulky virtuálních volání (vtable) a jsou volány přímo.