Sobes.tech
Middle

Dispetçer nima?

sobes.tech AI

AIdan javob

Dispatch — bu dastur davomida qaysi metod yoki funksiyaning aniq bajarilishini aniqlash jarayonidir.

Swiftda uchta asosiy dispatch turi mavjud:

  1. Statik (Statik yoki to'g'ridan-to'g'ri Dispatch): Eng tez. Kompilyator aniq biladi qaysi metod chaqirilishini, kompilyatsiya bosqichida. Metodni qidirish uchun qo'shimcha xarajatlar yo'q. Quyidagilar uchun qo'llaniladi:

    • Strukturalar (struct).
    • Enumlar (enum).
    • final yoki private bilan belgilangan metodlar (agar @objc yo'q va dinamik dispatch Objective-C runtime orqali ishlatilmayotgan bo'lsa).
    • Global va statik funksiyalar.
    • Extensionlar.
  2. Jadvalga asoslangan (Table Dispatch): Klasslar uchun ishlatiladi. Har bir klass uchun virtual jadval (vtable) yaratiladi, unda metodlarning amalga oshirilishiga ko'rsatkichlar joylashgan. Metod chaqirilganda, ko'rsatkich jadvalda qidiriladi. Biroz qo'shimcha xarajatlar bor. Quyidagilar uchun:

    • Klasslar instansiya metodlari (klass metodlari), final yoki private bilan belgilangan emas.
    • Hisoblangan xususiyatlar (computed properties).
    class Animal {
        func speak() { // Jadvalga asoslangan dispatch
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Qayta yozilgan metod, shuningdek jadvalga asoslangan dispatch
            print("Woof")
        }
    }
    
  3. Dinamik (Dynamic Dispatch): Eng sekin. Metodning hal qilinishi bajarilayotgan vaqtda Objective-C runtime orqali amalga oshiriladi. Objective-C bilan muloqot qilish uchun ishlatiladi. Katta xarajatlar bor. Quyidagilar uchun:

    • @objc dynamic bilan belgilangan metodlar.
    • @objc dynamic bilan belgilangan xususiyatlar.
    • Key-Value Observing (KVO).
    • Key-Value Coding (KVC).
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dynamic Dispatch
            print("Performing action")
        }
    }
    

Xulosa jadvali:

Tip Tezlik Qo'shimcha xarajatlar Qayerda qo'llaniladi
Statik Yuqori Past Struct, Enum, final/private metodlar, extensionlar
Jadvalga asoslangan O'rtacha O'rtacha Klasslar metodlari ( final/private bo'lmagan)
Dinamik Past Yuqori @objc dynamic

Dispatch turini tanlash, unumdorlikni optimallashtirish uchun muhimdir. Swift odatda, kerak bo'lsa, polimorfizmning moslashuvchanligini saqlab qolish uchun eng samarali turni tanlaydi (klasslar uchun jadvalga asoslangan dispatchni ishlatadi). final yoki private dan foydalanish, kompilyatorga statik dispatchni qo'llashda yordam berishi mumkin.