Sobes.tech
Middle+

Дар кадом вақт ва дар кадом шароитҳо диспетчеризатсия дар Swift оғоз меёбад?

sobes.tech AI

Ҷавоб аз AI

Роҳбарии усулҳо (method dispatch) дар Swift муайян мекунад, ки кадом код ҳангоми даъвати усули объект иҷро мешавад. Интихоби навъи роҳбарӣ дар ҳамин лаҳзаи компилятсияи Swift-код сурат мегирад.

Се навъи асосии роҳбарӣ дар Swift мавҷуд аст:

  1. Роҳбарии мустақим (Direct Dispatch):

    • Беҳтарин суръат.
    • Суроғаи функсия дар вақти компилятсия маълум аст.
    • Дар ҳолати пешфарз барои:
      • struct ва enum (аз он ҷиҳат ки онҳо наслеи кластаро дастгирӣ намекунанд).
      • Методҳои final кластаро.
      • Методҳои private кластаро (internal ва public дастгирӣ намекунанд).
      • Функсияҳои глобалӣ.
      • Методҳои статикӣ.
      • Идомаҳо (extensions).
  2. Роҳбарии тавассути ҷадвал (Table Dispatch):

    • Барои class истифода мешавад, вақте ки полиморфизм ва наслеи лозим аст.
    • Суроғаи иҷрои конкретии метод дар вақти иҷро (runtime) бо истифода аз ҷадвали виртуалӣ (vtable - Virtual Table) муайян мешавад.
    • Ҳар як класа vtable-и худро дорад, ки нишондиҳандаҳо ба иҷрои методҳоро дар бар мегирад.
    • Наслеи ва ивазкунии методҳоро дастгирӣ мекунад.
    class Animal { // Барои истифодаи Table Dispatch
        func speak() {
            print("Номаълуми садо")
        }
    }
    
    class Dog: Animal { // Ивазкунӣ, истифодаи vtable
        override func speak() {
            print("Woof")
        }
    }
    
  3. Роҳбарии тавассути шаҳодатнома (Witness Table Dispatch):

    • Барои протоколҳо (protocol) истифода мешавад.
    • Монанд ба table dispatch, аммо истифода аз ҷадвали шаҳодатнома (witness table) барои ёфтани иҷрои усули протокол барои навъи мушаххас, ки ба протокол мувофиқат мекунад.
    • Имкон медиҳад, ки полиморфизм бо протоколҳоро истифода бурдан мумкин аст.
    protocol Speakable { // Барои истифодаи Witness Table Dispatch
        func speak()
    }
    
    struct Cat: Speakable { // Иҷрои протокол
        func speak() {
            print("Мяу")
        }
    }
    

Шартҳое, ки ба интихоби таъсир мерасонанд:

  • Навъи додаҳо: struct, enum, class, protocol.
  • Модификаторҳои дастрасӣ: final, private, internal, public.
  • Наслеи: имконияти иваз кардани методҳо.
  • Мувофиқати протоколҳо: иҷрои методҳо аз протокол.
  • Мавқеи даъват: даъват тавассути навъи мушаххас ё тавассути протокол/класи асосӣ.

Камилятори Swift кӯшиш мекунад, ки дар ҷойҳое, ки имкон дорад, роҳбарии мустақимро истифода барад барои оптимизатсияи иҷроиш, аммо дар ҳолати зарурӣ барои дастгирии полиморфизм ва наслеи ба роҳбарии тавассути ҷадвал ё шаҳодатнома мегузарад. Иҷрои равшан ҳамчун final ё private имкон медиҳад, ки истифодаи роҳбарии мустақим маҷбур карда шавад.