Включает ли ключевое слово @objc
отправку сообщений, а также dynamic
?
Не обычно. Как правило, атрибут @objc
сам по себе просто предоставляет заданному члену класса Objective-C - Swift все еще свободен отправлять ему, используя таблицу или статическую диспетчеризацию. Вам нужно было бы пометить участника как dynamic
, если вы хотите, чтобы Swift использовал отправку сообщений при его вызове.
Однако для нефинала @objc
class extension member Swift автоматически выведет его равным dynamic
. Зачем? Потому что по причинам совместимости Swift позволяет элементам расширения @objc
переопределять и переопределять (очень похоже на то, как вы можете переопределить метод Obj-C в категории подкласса). Для достижения этой цели Swift использует диспетчеризацию сообщений Obj-C.
Следовательно, в расширении @objc
выводит dynamic
. Вы не можете переопределить элемент расширения, не открывая его среде выполнения Obj-C, поскольку элементы расширения в настоящее время не могут быть добавлены в виртуальные таблицы класса Swift (так как в настоящее время виртуальные таблицы Swift не могут иметь членов, динамически добавляемых к ним во время выполнения).
Но это не NSObject
экземпляр.
На платформах Apple (т. Е. С поддержкой Obj-C) все Swift-классы открыты для среды выполнения Obj-C, и все неявно наследуются от специального базового класса Obj-C, называемого _SwiftObject
, что соответствует NSObjectProtocol
. Таким образом, классы Swift могут воспользоваться отправкой сообщений без наследования от NSObject
.