Я проверил несколько isa swizzling с помощью Swift и обнаружил, что он работает только в том случае, если NSObject является суперклассом (напрямую или дальше) или с помощью Украшение '@objc'. В противном случае он будет следовать статическому и vtable-отправке, например, С++.
Нормально ли определять класс Swift без базового класса Cocoa/NSObject? Если это касается меня, это означает отказ от большей части динамизма Objective-C, например, перехват метода и интроспекция времени выполнения.
Динамическое поведение во время выполнения лежит в основе функций, таких как наблюдатели свойств, Core Data, Аспектно-ориентированное программирование, Сообщения более высокого порядка обмена сообщениями, аналитические и протокольные фреймворки и т.д.
Использование стиля вызова Objective-C добавляет к вызову метода около 20 операндов машинного кода, поэтому в определенных ситуациях (многие жесткие вызовы методам с малыми телами) статический и виртуальный диспетчерский стиль С++ может работать лучше.
Но учитывая общее правило 95-5 (95% прироста производительности исходит от настройки 5% кода), не имеет смысла начинать с мощных динамических функций и затвердевать там, где это необходимо?