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.