Sobes.tech
Junior — Middle

Hogyan valósul meg a módszerek diszpécserelése, amelyeket Extension segítségével adtak hozzá protokollokhoz?

sobes.tech MI

Válasz az MI-től

A Swift protokollokhoz hozzáadott kiterjesztéses módszerek statikus elosztással vannak megvalósítva. Ez azt jelenti, hogy az ilyen módszerek hívását a fordítási szakaszban határozzák meg, nem pedig futás közben. Ellentétben azokkal a módszerekkel, amelyeket közvetlenül a protokollban deklaráltak (amelyek a virtuális metódus táblán keresztül dinamikus elosztást használnak), a kiterjesztésből származó módszerek nem írhatók felül konkrét típusokban, és közvetlenül a típus szerint hívhatók, amelyet a fordítási szakaszban ismerünk.

Például, ha van egy protokoll és egy kiterjesztés egy módszerrel, majd egy típus, amely megvalósítja ezt a protokollt, akkor a kiterjesztésből származó módszer hívása mindig a kiterjesztés implementációját fogja használni, még akkor is, ha a típus ugyanazzal a névvel megvalósít egy módszert. Ez abból adódik, hogy a kiterjesztések nem adnak hozzá módszereket a protokoll virtuális hívási táblájához.

protocol MyProtocol {}

extension MyProtocol {
    func greet() {
        print("Helló a kiterjesztésből")
    }
}

struct MyStruct: MyProtocol {
    func greet() {
        print("Helló a MyStruct-ből")
    }
}

let obj: MyProtocol = MyStruct()
obj.greet() // Kiírja: Helló a kiterjesztésből

let obj2 = MyStruct()
obj2.greet() // Kiírja: Helló a MyStruct-ből

Ezért a protokoll kiterjesztéséből származó módszerek statikusan hívódnak, ami fontos figyelembe venni az architektúra tervezésekor.