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 не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.