Ответ
Swizzling (подмена реализации метода во время выполнения) работает только с динамической диспетчеризацией. Его невозможно применить к:
- Статической (прямой) диспетчеризации — вызовы, разрешаемые на этапе компиляции.
- Inlined-функциям и методам — код, который компилятор оптимизирует, встраивая его прямо в место вызова.
- Прямому доступу к переменным экземпляра (ivar) — доступ к полям, минуя методы-сеттеры/геттеры.
- Методам Swift без модификаторов
@objcиdynamic— по умолчанию Swift использует статическую или виртуально-табличную диспетчеризацию, которую нельзя swizzle.
Практическое правило: Swizzling требует, чтобы метод был виден runtime Objective-C.
Пример:
class ExampleClass {
// Можно swizzle: доступен динамически через Objective-C runtime
@objc dynamic func swizzlableMethod() {}
// НЕЛЬЗЯ swizzle: статическая диспетчеризация Swift
func nonSwizzlableMethod() {}
}