Sobes.tech
Junior — Middle

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.