Jak zaimplementowano dispatching metod dodanych przez Extension do protokołów?
sobes.tech AI
Odpowiedź od AI
Metody dodane przez rozszerzenie w protokołach Swift są implementowane za pomocą statycznego dispatch. Oznacza to, że wywołanie takich metod jest ustalane na etapie kompilacji, a nie w czasie wykonywania. W przeciwieństwie do metod bezpośrednio deklarowanych w protokole (które korzystają z dynamicznego dispatchu przez tabelę metod wirtualnych), metody z rozszerzeń nie mogą być nadpisywane w konkretnych typach i są wywoływane bezpośrednio według typu, znanego na etapie kompilacji.
Na przykład, jeśli masz protokół i rozszerzenie z metodą, a następnie typ, który implementuje ten protokół, wywołanie metody z rozszerzenia zawsze będzie korzystać z implementacji z rozszerzenia, nawet jeśli typ implementuje metodę o tej samej nazwie. Wynika to z faktu, że rozszerzenia nie dodają metod do tabeli wywołań wirtualnych protokołu.
protocol MyProtocol {}
extension MyProtocol {
func greet() {
print("Cześć z rozszerzenia")
}
}
struct MyStruct: MyProtocol {
func greet() {
print("Cześć z MyStruct")
}
}
let obj: MyProtocol = MyStruct()
obj.greet() // Wypisze: Cześć z rozszerzenia
let obj2 = MyStruct()
obj2.greet() // Wypisze: Cześć z MyStruct
W związku z tym, metody z rozszerzeń protokołów są wywoływane statycznie, co jest ważne do uwzględnienia przy projektowaniu architektury.