Kuidas on rakendatud meetodite jaotamine, mis on lisatud Extension kaudu protokollidele?
sobes.tech AI
Vastus AI-lt
Metodid, mis on lisatud Swift protokollidele laienduste kaudu, on rakendatud staatilise jaotamise abil. See tähendab, et selliste meetodite väljakutse määratakse kompileerimise ajal, mitte käitamise ajal. Erinevalt meetoditest, mis on otse protokollis deklareeritud (mis kasutavad dünaamilist jaotamist virtuaalsete meetodite tabeli kaudu), ei saa laienduste meetodid olla konkreetsetes tüüpides üle kirjutatud ning neid kutsutakse otse tüübi järgi, mis on teada kompileerimise ajal.
Näiteks, kui teil on protokoll ja laiendus meetodiga, ning seejärel tüüp, mis rakendab seda protokolli, kasutab laiendusmeetodi väljakutse alati laiendusest pärit rakendust, isegi kui tüüp rakendab sama nimega meetodit. See on tingitud sellest, et laiendused ei lisa meetodeid protokolli virtuaalsete väljakutsete tabelisse.
protocol MyProtocol {}
extension MyProtocol {
func greet() {
print("Tere laiendusest")
}
}
struct MyStruct: MyProtocol {
func greet() {
print("Tere MyStructist")
}
}
let obj: MyProtocol = MyStruct()
obj.greet() // Kuvab: Tere laiendusest
let obj2 = MyStruct()
obj2.greet() // Kuvab: Tere MyStructist
Seetõttu kutsutakse protokollide laienduste meetodeid statiliselt, mis on arhitektuuri kavandamisel oluline arvestada.