Вопрос проверяет понимание того, как Swift интегрируется в существующую экосистему Objective-C и какие механизмы лежат в основе совместимости.
Вопрос проверяет понимание того, как Swift интегрируется в существующую экосистему Objective-C и какие механизмы лежат в основе совместимости.
Swift изначально проектировался как язык, способный сосуществовать с Objective-C, а не заменить его мгновенно.
Objective-C runtime — динамическая система, отвечающая за message sending, introspection и работу классов в Objective-C.
Swift-код начинает взаимодействовать с Objective-C runtime, если:
Класс наследуется от NSObject
Используется аннотация @objc
Метод или свойство доступны из Objective-C
Тип используется в UIKit / Foundation API
В этих случаях:
методы регистрируются в runtime
вызовы идут через message sending
используется dynamic dispatch
Чистый Swift-код:
struct, enum
final class
generics
value-типы
может:
использовать собственный Swift runtime
работать без message sending
вызывать методы через static dispatch
Для совместимости Swift:
генерирует Objective-C интерфейсы (-Swift.h)
маппит типы (String ↔ NSString)
управляет ownership автоматически
Это позволяет:
вызывать Swift из Objective-C
вызывать Objective-C из Swift
без ручного управления памятью.
Использование Objective-C runtime в Swift:
добавляет runtime-overhead
ограничивает оптимизации
требует учитывать dynamic dispatch
Swift может работать как поверх Objective-C runtime, так и независимо от него. Чем меньше @objc и наследования от NSObject, тем больше возможностей для оптимизаций.