Sobes.tech
Junior — Middle

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.