Sobes.tech
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.