Sobes.tech
Middle+

Millal ja millistel tingimustel hakkab Swiftis tööle dispacheerimine?

sobes.tech AI

Vastus AI-lt

Metoodite jaotamine (method dispatch) Swift määrab, milline kood täpselt täidetakse objekti meetodi kutsudes ajal. Valik toimub Swift-koodi kompileerimise ajal.

On kolm peamist meetodi jaotamise tüüpi Swift:

  1. Otse jaotamine (Direct Dispatch):

    • Kõige kiirem.
    • Funktsiooni aadress on teada kompileerimise ajal.
    • Kasutatakse vaikimisi:
      • struct ja enum (sest nad ei toeta klassipärandit).
      • final klasside meetodid.
      • private klasside meetodid (internal ja public ei toeta otse jaotamist).
      • Globaalset funktsioone.
      • Statilisi meetodeid.
      • Laiendusi (extensions).
  2. Tabeli jaotamine (Table Dispatch):

    • Kasutatakse class, kui on vaja polümorfismi ja pärandit.
    • Konkreetse meetodi realiseerimise aadress määratakse jooksvalt (runtime) virtuaalsete meetodite tabeli (vtable - Virtual Table) abil.
    • Iga klass omab oma vtable, mis sisaldab näitajaid meetodite realiseerimistele.
    • Toetab pärandit ja meetodite ülekirjutamist.
    class Animal { // Kasutab Table Dispatch
        func speak() {
            print("Tundmatu hääl")
        }
    }
    
    class Dog: Animal { // Ülekirjutus, kasutab vtable
        override func speak() {
            print("Woof")
        }
    }
    
  3. Tunnistaja tabeli jaotamine (Witness Table Dispatch):

    • Kasutatakse protokollidele (protocol).
    • Sarnane table dispatch-ile, kuid kasutab tunnistaja tabelit (witness table), et leida protokolli meetodi realiseerimine konkreetse tüübi jaoks, mis vastab protokollile.
    • Võimaldab kasutada polümorfismi protokollidega.
    protocol Speakable { // Kasutab Witness Table Dispatch
        func speak()
    }
    
    struct Cat: Speakable { // Protokolli realiseerimine
        func speak() {
            print("Miau")
        }
    }
    

Valikule mõjutavad tingimused:

  • Andmetüüp: struct, enum, class, protocol.
  • Juurdepääsuklassid: final, private, internal, public.
  • Pärandamine: Meetodite ülekirjutamise võimalus.
  • Protokollide vastavus: Meetodite realiseerimine protokollidest.
  • Kontekst kutsumiseks: Kutsumine konkreetse tüübi või protokolli/baasklassi kaudu.

Swift kompilaator püüab kasutada otse jaotamist, kus see on võimalik, jõudluse optimeerimiseks, kuid vajadusel toetab polümorfismi ja pärandit, vahetades tabeli või tunnistaja tabeli jaotamisele. Selge meetodi märkimine final või private võimaldab sunniviisiliselt kasutada otse jaotamist.