Cocoa, Swift, Objective-C: Swift Type Compatibility (совместимость типов Swift)

Как уже говорилось выше, чтобы swift класс(свойство, индекс, метод) были доступны в Objective-C — необходимо предварять их атрибутом @objc (при использовании атрибутов @IBOutlet, @IBAction, или @NSManaged — атрибут @objc добавляется автоматически). Если класс унаследован от NSObject — этот класс автоматически помечается этим атрибутом.
В классе помеченном @objc все public и internal члены автоматически помечаются @objc

С помощью @objc так же можно поменять имя под которым член будет виден в Objective-C

Если применить @objc(имя) на swift классе — он станет доступен в Objective-C без пространства имен (namespacing)

Но использование @objc атрибута не гарантирует что будет использована динамическая диспетчеризация (dynamic dispatch). Компилятор может девиртуализировать или сделать встроенным (inline) доступ к члену, обходя runtime Objective-C. Чтобы этого избежать и применяется модификатор dynamic. Применение модификатора dynamic автоматически добавляет атрибут @objc.
Нужно это редко. К примеру в Objective-C коде применяем функцию method_exchangeImplementations и меняем реализацию метода, но swift сделал метод встроенным и по прежнему вызывает старую реализацию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *