Ako je implementované riadenie metódov pridaných prostredníctvom Extension do protokolov?
sobes.tech AI
Odpoveď od AI
Metódy pridané rozšírením v protokoloch Swift sú implementované pomocou statickej dispatch. To znamená, že volanie takýchto metód je určené v čase kompilácie, nie počas behu. Na rozdiel od metód, ktoré sú priamo deklarované v protokole (ktoré používajú dynamickú dispatch cez tabuľku virtuálnych metód), metódy z rozšírení nemôžu byť prepísané v konkrétnych typoch a sú volané priamo podľa typu, ktorý je známy v čase kompilácie.
Napríklad, ak máte protokol a rozšírenie s metódou, a potom typ, ktorý implementuje tento protokol, volanie metódy z rozšírenia vždy použije implementáciu z rozšírenia, aj keď typ implementuje metódu s rovnakým názvom. To je spôsobené tým, že rozšírenia nepridávajú metódy do tabuľky volaní virtuálnych metód protokolu.
protocol MyProtocol {}
extension MyProtocol {
func greet() {
print("Ahoj z rozšírenia")
}
}
struct MyStruct: MyProtocol {
func greet() {
print("Ahoj z MyStruct")
}
}
let obj: MyProtocol = MyStruct()
obj.greet() // Vypíše: Ahoj z rozšírenia
let obj2 = MyStruct()
obj2.greet() // Vypíše: Ahoj z MyStruct
Preto sa metódy z rozšírení protokolov volajú staticky, čo je dôležité zohľadniť pri navrhovaní architektúry.