Swift 3 - динамический против @objc
Какая разница между маркировкой метода как @objc против динамического, когда вы будете делать один против другого?
Ниже дано определение Apple для динамического.
динамический Примените этот модификатор к любому члену класса, который может быть представлен Objective-C. Когда вы помечаете объявление члена динамическим модификатором, доступ к этому члену всегда динамически отправляется с использованием среды выполнения Objective C. Доступ к этому члену никогда не встроен и не искажен компилятором.
Поскольку объявления, помеченные динамическим модификатором, отправляются с использованием среды выполнения Objective C, они неявно помечаются атрибутом objc.
2 ответа
Функция / переменная, объявленная как @objc
доступен из Objective-C, но Swift продолжит получать к нему доступ напрямую через статическую или виртуальную диспетчеризацию. Это означает, что если функция / переменная перемещается через среду Objective C, например, что происходит при использовании Key-Value Observing или различных API Objective C для изменения классов, вызов метода из Swift и Objective C приведет к другим результатам.
С помощью dynamic
говорит Swift всегда обращаться к динамической диспетчеризации Objective-C. Это необходимо для правильной работы таких вещей, как Key-Value Observing. Когда вызывается функция Swift, она ссылается на среду выполнения Objective C для динамической отправки вызова.
Как говорится в этой цитате, dynamic
подразумевает @objc
,
Если вы не указали класс как dynamic
Компилятор может оптимизировать и встроить свои методы. Это дает огромный выигрыш в производительности, но это означает, что вы не можете изменять эти реализации методов во время выполнения. Если вы планируете возиться с этими методами во время выполнения, используя возможности отражения среды выполнения Objective C, вам необходимо использовать dynamic
, Вы понесете снижение производительности (ваш код будет работать на уровне скорости Objective C, а не на уровне, подобном C), но вы получите дополнительный динамизм.
Работать с Objective-C
от Swift
у вас есть как минимум два зарезервированных слова:
@objc
[О программе] -Время компиляции - чтобыоткрыть API Swift длясреды выполнения Objective-C. Например, фреймворк, написанный на Swift, может использовать@objc
за:- с помощью
#selector
[About] в коде Swift - открытие общедоступной функциональности для потребителей Objective-C
- с помощью
dynamic
- Выполнить время - чтобы включитьmessage dispatch
(Мир Objective-C) дляNSObject
объект, который отличается отvirtual dispatch (table dispatch)
(Мир Свифта). Он используется для:- КВО
class extensions
чтобы иметь возможность переопределить функцию расширения- swizzling [Пример]
Перед Swift v4
dynamic
включены @objc
При взаимодействии необходимо учитывать два ключевых слова:
@objc
означает, что вы хотите, чтобы ваш код Swift (класс, метод, свойство и т. д.) был виден из Objective-C.dynamic
означает, что вы хотите использовать динамическую диспетчеризацию Objective-C.
В Swift 3 и ранее dynamic
также подразумевается @objc
, Новое в Swift 4, dynamic
означает только динамическую диспетчеризацию и ничего не говорит о видимости Objective-C.
Однако не существует такой вещи, как динамическая диспетчеризация Swift; у нас есть только динамическая диспетчеризация Objective-C. Это означает, что вы не можете иметь только динамический, и вы должны написать @objc dynamic
, Так что это фактически та же самая ситуация, что и прежде, только что сделанная явной.
Узнайте больше здесь