Sobes.tech
Middle+

Swiftda qaysi vaqtda va qanday shartlarda boshqaruv ishlay boshlaydi?

sobes.tech AI

AIdan javob

Swift'da metodların (method dispatch) tayin qiladi, qaysi kod chaqirilganda bajariladi. Dispatch turini tanlash Swift kodining kompilyatsiya qilish vaqtida amalga oshiriladi.

Swift'da uchta asosiy dispatch turi mavjud:

  1. To'g'ridan-to'g'ri dispatch (Direct Dispatch):

    • Eng tez.
    • Funktsiyaning manzili kompilyatsiya vaqtida ma'lum.
    • Standart ravishda quyidagilar uchun qo'llaniladi:
      • struct va enum (ular meros olishni qo'llab-quvvatlamaydi).
      • final sinflar metodlari.
      • private sinflar metodlari (internal va public qo'llab-quvvatlamaydi).
      • Global funksiyalar.
      • Statik metodlar.
      • Kengaytmalar.
  2. Jadval bo'yicha dispatch (Table Dispatch):

    • class uchun ishlatiladi, polimorfizm va meros olish talab qilinadigan hollarda.
    • Aniq metodning manzili ish vaqtida (runtime) virtual metodlar jadvali (vtable - Virtual Table) yordamida aniqlanadi.
    • Har bir sinf o'zining vtable'iga ega, unda metodlarning amalga oshirilishiga ko'rsatkichlar mavjud.
    • Meros olish va metodlarni qayta yozishni qo'llab-quvvatlaydi.
    class Animal { // Jadval bo'yicha dispatch qo'llanadi
        func speak() {
            print("Noma'lum tovush")
        }
    }
    
    class Dog: Animal { // Qayta yozish, vtable ishlatadi
        override func speak() {
            print("Vov")
        }
    }
    
  3. Guvohnoma jadvali bo'yicha dispatch (Witness Table Dispatch):

    • Protokollar (protocol) uchun ishlatiladi.
    • Jadval bo'yicha dispatchga o'xshash, lekin protokol metodining amalga oshirilishini topish uchun guvohnoma jadvali (witness table) ishlatiladi.
    • Protokollar bilan polimorfizmni ta'minlaydi.
    protocol Speakable { // Guvohnoma jadvali bo'yicha dispatch
        func speak()
    }
    
    struct Cat: Speakable { // Protokolni amalga oshirish
        func speak() {
            print("Miyav")
        }
    }
    

Tanlovga ta'sir qiluvchi shartlar:

  • Ma'lumot turi: struct, enum, class, protocol.
  • Kirish modifikatorlari: final, private, internal, public.
  • Meros olish: metodlarni qayta yozish imkoniyati.
  • Protokollarga moslik: protokol metodlarini amalga oshirish.
  • Chaqirish konteksti: konkret tur yoki protokol/asos sinf orqali chaqirish.

Swift kompilyatori imkon qadar to'g'ridan-to'g'ri dispatchni ishlatishga harakat qiladi, lekin polimorfizm va meros olishni qo'llab-quvvatlash uchun jadval yoki guvohnoma jadvali dispatchiga o'tadi. final yoki private sifatida aniq belgilangan metodlar to'g'ridan-to'g'ri dispatchni majburlash imkonini beradi.