Поведение подкласса расширения ключевого слова @objc - PullRequest
0 голосов
/ 03 мая 2018

Может кто-нибудь объяснить, почему здесь необходимо ключевое слово @objc для компиляции кода?

Как я понял, это ключевое слово используется для работы метода отправки сообщений ObjC. Но это не NSObject экземпляр.

 class MyClass {
 }

 extension MyClass {
     @objc func extensionMethod() { /// THIS LINE
         print("A")
     }
 }

 class SubClass: MyClass {
     override func extensionMethod() {
         print("B")
     }
 }

Включает ли ключевое слово @objc отправку сообщений, а также dynamic? Или нет?

1 Ответ

0 голосов
/ 03 мая 2018

Включает ли ключевое слово @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.

...