Sobes.tech
Junior — Middle

Kako je implementirana dispatching metoda dodanih putem Extension u protokolima?

sobes.tech АИ

Одговор од АИ

Metode koje su dodate putem proširenja u Swift protokolima implementirane su pomoću statičkog raspoređivanja. To znači da se poziv takvih metoda određuje u fazi kompilacije, a ne tokom izvršavanja. Za razliku od metoda koje su direktno deklarisane u protokolu (koje koriste dinamičko raspoređivanje putem tabele virtuelnih metoda), metode iz proširenja ne mogu biti prepisane u specifičnim tipovima i pozivaju se direktno po tipu, poznatom u fazi kompilacije.

Na primer, ako imate protokol i proširenje sa metodom, a zatim tip koji implementira taj protokol, poziv metode iz proširenja uvek će koristiti implementaciju iz proširenja, čak i ako tip implementira metodu sa istim imenom. To je zato što proširenja ne dodaju metode u tabelu virtuelnih poziva protokola.

protocol MyProtocol {}

extension MyProtocol {
    func greet() {
        print("Zdravo iz proširenja")
    }
}

struct MyStruct: MyProtocol {
    func greet() {
        print("Zdravo iz MyStruct")
    }
}

let obj: MyProtocol = MyStruct()
obj.greet() // Ispisaće: Zdravo iz proširenja

let obj2 = MyStruct()
obj2.greet() // Ispisaće: Zdravo iz MyStruct

Dakle, metode iz proširenja protokola se pozivaju statički, što je važno uzeti u obzir pri projektovanju arhitekture.