Предотвращение создания подклассов классов Objective C в Swift - PullRequest
0 голосов
/ 10 октября 2018

Я добавляю внутренние аннотации Swift к своим классам Objective-C.Я пытаюсь предотвратить подклассы моего класса:

__attribute__((objc_subclassing_restricted))
@interface CWTestFinalClass : NSObject
@end

Это работает, как и ожидалось в Objective-C:

// Generates Error, as expected
@interface CWTestSubclass : CWTestFinalClass
@end

Однако я все еще могу подкласс в Swift

// Should fail, but works without error
class TestSubclass: CWTestFinalClass {

}

Вопрос: Как предотвратить подклассы классов Objective-C в Swift?

1 Ответ

0 голосов
/ 10 октября 2018

Objective C не имеет ключевого слова final или чего-либо подобного.Даже если бы атрибут или модификатор времени компиляции существовал, его можно было бы обойти стороной за счет использования API времени выполнения для динамического создания подкласса любого класса psuedofinal.

Компилятор Swift принудил, чтобы Swift мог блокировать попытки подкласса класса final, но это не помешало бы Objective C сделать это (что не компилируется с помощью компилятора Swift).Таким образом, был добавлен атрибут objc_subclassing_restricted, специально для того, чтобы заставить clang обеспечить незаконность создания подклассов final Swift классов.

Нет ничего особенного в том, чтобы сделать окончательные классы Objective C окончательными, даже если бы это было возможно.Objective C - гораздо более динамичный язык, который, кажется, следует мантре Python «мы все взрослые здесь».

Самая большая причина для поддержки классов final - сообщить компилятору, какие классы являются кандидатами навиртуализация.Но Objective C всегда использует динамическую диспетчеризацию и, в любом случае, никогда не отменяет виртуализацию.

...