Sobes.tech
Junior — Middle

Koji mehanizam dispatch-a se primenjuje prilikom poziva metode definisane u protokolu koji je proširen pomoću Extension?

sobes.tech АИ

Одговор од АИ

U Swift-u, ako je metoda definisana u protokolu, a zatim je protokol proširen putem Extension sa implementacijom te metode, prilikom poziva metode putem reference na protokol koristi se staticka dispatch (static dispatch). To znači da će poziv metode biti usmeren na implementaciju iz proširenja protokola, a ne na implementaciju u konkretnom tipu, čak i ako ga taj tip prepisuje.

Drugim rečima, metode implementirane u proširenjima protokola ne podržavaju dinamičku dispatch (dynamic dispatch), za razliku od obaveznih metoda protokola koje su implementirane u tipovima.

Primer:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Podrazumevana implementacija u proširenju")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Implementacija u MyStruct")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Ispisaće "Podrazumevana implementacija u proširenju"

Ovo je povezano s tim da metode iz proširenja protokola nisu uključene u tabelu virtuelnih poziva (vtable) i pozivaju se direktno.