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.