Sobes.tech
Junior — Middle

Ce mecanism de dispatch se aplică la apelarea unei metode definite într-un protocol care a fost extins printr-o Extension?

sobes.tech AI

Răspuns de la AI

În Swift, dacă o metodă este definită într-un protocol și apoi protocolul este extins printr-o extensie cu implementarea acestei metode, atunci la apelarea metodei printr-o referință la protocol se utilizează dispecția statică (static dispatch). Aceasta înseamnă că apelul metodei va fi direcționat către implementarea din extensia protocolului, și nu către implementarea dintr-un tip specific, chiar dacă tipul o suprascrie.

Cu alte cuvinte, metodele implementate în extensiile de protocoale nu suportă dispecția dinamică (dynamic dispatch), spre deosebire de metodele obligatorii ale protocolului, implementate în tipuri.

Exemplu:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Implementare implicită în extensie")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementare în MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Va afișa "Implementare implicită în extensie"

Acest lucru se datorează faptului că metodele din extensiile de protocoale nu sunt incluse în tabelul de apeluri virtuale (vtable) și sunt apelate direct.