Sobes.tech
Junior — Middle

Kaip įgyvendinama metodų, pridėtų per Extension į protokolus, paskirstymas?

sobes.tech AI

Atsakymas iš AI

Metodai, pridėti per plėtinį Swift protokoluose, įgyvendinami naudojant statinį paskirstymą. Tai reiškia, kad tokių metodų iškvietimas yra nustatomas kompiliacijos metu, o ne vykdymo metu. Skirtingai nuo metodų, tiesiogiai deklaruotų protokole (kurie naudoja dinaminį paskirstymą per virtualiųjų metodų lentelę), plėtinių metodai negali būti perrašyti konkrečiuose tipuose ir yra iškviečiami tiesiogiai pagal tipą, kuris yra žinomas kompiliacijos metu.

Pavyzdžiui, jei turite protokolą ir plėtinį su metodu, ir tada tipą, kuris įgyvendina šį protokolą, plėtinio metodo iškvietimas visada naudos plėtinio įgyvendinimą, net jei tipas įgyvendina tą patį pavadinimą turintį metodą. Tai susiję su tuo, kad plėtiniai neprideda metodų į protokolo virtualiųjų iškvietimų lentelę.

protocol MyProtocol {}

extension MyProtocol {
    func greet() {
        print("Sveiki iš plėtinio")
    }
}

struct MyStruct: MyProtocol {
    func greet() {
        print("Sveiki iš MyStruct")
    }
}

let obj: MyProtocol = MyStruct()
obj.greet() // Išves: Sveiki iš plėtinio

let obj2 = MyStruct()
obj2.greet() // Išves: Sveiki iš MyStruct

Todėl, metodai iš protokolų plėtinių yra iškviečiami statiniu būdu, kas yra svarbu atsižvelgti kuriant architektūrą.