Sobes.tech
Junior — Middle

Milline dispatch-mehhanism rakendub, kutsudes protokolis, millel on laiend, millel on laiendus?

sobes.tech AI

Vastus AI-lt

Swiftis, kui meetod on määratletud protokollis ja seejärel protokoll laieneb Extensioni kaudu selle meetodi rakendusega, siis meetodi kutsumisel protokolli viitega kasutatakse staatilist saatmist (static dispatch). See tähendab, et meetodi kutsumine suunatakse protokolli laienduse rakendusele, mitte konkreetse tüübi rakendusele, isegi kui tüüp seda üle kirjutab.

Teisisõnu, protokolli laiendustes rakendatud meetodid ei toeta dünaamilist saatmist (dynamic dispatch), erinevalt protokolli kohustuslikest meetoditest, mis on rakendatud tüüpides.

Näide:

protocol MyProtocol {
    func requiredMethod()
}

extension MyProtocol {
    func requiredMethod() {
        print("Vaikimisi rakendus laienduses")
    }
}

struct MyStruct: MyProtocol {
    func requiredMethod() {
        print("Rakendus MyStructis")
    }
}

let instance: MyProtocol = MyStruct()
instance.requiredMethod() // Trükib "Vaikimisi rakendus laienduses"

See on seotud sellega, et protokolli laiendustest pärinevad meetodid ei kuulu virtuaalsete väljakutsete tabelisse (vtable) ja kutsutakse otse.