Какие типы диспетчеризации методов в Swift/Objective-C невозможно изменить с помощью Swizzling?

«Какие типы диспетчеризации методов в Swift/Objective-C невозможно изменить с помощью Swizzling?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Swizzling (подмена реализации метода во время выполнения) работает только с динамической диспетчеризацией. Его невозможно применить к:

  1. Статической (прямой) диспетчеризации — вызовы, разрешаемые на этапе компиляции.
  2. Inlined-функциям и методам — код, который компилятор оптимизирует, встраивая его прямо в место вызова.
  3. Прямому доступу к переменным экземпляра (ivar) — доступ к полям, минуя методы-сеттеры/геттеры.
  4. Методам Swift без модификаторов @objc и dynamic — по умолчанию Swift использует статическую или виртуально-табличную диспетчеризацию, которую нельзя swizzle.

Практическое правило: Swizzling требует, чтобы метод был виден runtime Objective-C.

Пример:

class ExampleClass {
    // Можно swizzle: доступен динамически через Objective-C runtime
    @objc dynamic func swizzlableMethod() {}

    // НЕЛЬЗЯ swizzle: статическая диспетчеризация Swift
    func nonSwizzlableMethod() {}
}