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ą.