Sobes.tech
Middle+

Kad un kādos apstākļos sāk darboties Swift dispečerēšana?

sobes.tech AI

Atbilde no AI

Meto izplatīšana (method dispatch) Swift nosaka, kurš tieši kods tiks izpildīts, izsaucot objekta metodi. Izvēle notiek Swift koda kompilācijas laikā.

Pastāv trīs galvenie meto izplatīšanas veidi Swift:

  1. Tieša izplatīšana (Direct Dispatch):

    • Ātrākā.
    • Funkcijas adrese ir zināma kompilācijas laikā.
    • Parasti tiek izmantota pēc noklusējuma:
      • struct un enum (jo tie neatbalsta klases mantošanu).
      • final klases metodes.
      • private klases metodes (internal un public nepārstāv tiešu izplatīšanu).
      • Globālas funkcijas.
      • Statiskās metodes.
      • Paplašinājumi (extensions).
  2. Tabulas izplatīšana (Table Dispatch):

    • Tiek izmantota class, ja nepieciešams polimorfisms un mantošana.
    • Konkrētās metodes realizācijas adrese tiek noteikta izpildes laikā (runtime), izmantojot virtuālo metožu tabulu (vtable - Virtual Table).
    • Katrai klasei ir sava vtable, kas satur norādītājus uz metožu realizācijām.
    • Atbalsta mantošanu un metožu pārrakstīšanu.
    class Animal { // Tabeles izplatīšana
        func speak() {
            print("Nezināms skaņa")
        }
    }
    
    class Dog: Animal { // Pārrakstīšana, izmanto vtable
        override func speak() {
            print("Woof")
        }
    }
    
  3. Liudzējtāja tabulas izplatīšana (Witness Table Dispatch):

    • Tiek izmantota protokoliem (protocol).
    • Līdzīga table dispatch, bet izmanto liudzējtāja tabulu (witness table), lai atrastu protokola metodes realizāciju konkrētam tipam, kas atbilst protokolam.
    • Ļauj izmantot polimorfismu ar protokoliem.
    protocol Speakable { // Tiek izmantota Witness Table Dispatch
        func speak()
    }
    
    struct Cat: Speakable { // Protokola realizācija
        func speak() {
            print("Mau")
        }
    }
    

Nosacījumi, kas ietekmē izvēli:

  • Datu tips: struct, enum, class, protocol.
  • Piekļuves modifikatori: final, private, internal, public.
  • Mantošana: Metožu pārrakstīšanas iespēja.
  • Protokolu atbilstība: Metožu realizācija no protokoliem.
  • Konteksts izsaukumam: Izsaukums caur konkrētu tipu vai caur protokolu/bāzes klasi.

Swift kompilators cenšas izmantot tiešu izplatīšanu, kur tas ir iespējams, optimizācijas nolūkos, bet, ja nepieciešams atbalsts polimorfismam un mantošanai, tas pārslēdzas uz table vai witness table izplatīšanu. Skaidrs metožu marķējums kā final vai private ļauj piespiest izmantot tiešu izplatīšanu.