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.