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("Уф")
        }
    }
    
  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 компилятору мүмкүн болсо түздөн-түз жөнөтүүнү колдонууга аракет кылат, аткаруу эффективдүүлүгүн жогорулатуу үчүн, бирок полиморфизм жана мураска колдоо керек болсо, table же witness table dispatchке которулат. Ачык белгиленген final же private методдор түздөн-түз жөнөтүүнү мажбурлайт.