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 за:

    1. с помощью #selector [About] в коде Swift
    2. открытие общедоступной функциональности для потребителей Objective-C
  • dynamic- Выполнить время - чтобы включитьmessage dispatch(Мир Objective-C) для NSObject объект, который отличается от virtual dispatch (table dispatch)(Мир Свифта). Он используется для:

    1. КВО
    2. class extensionsчтобы иметь возможность переопределить функцию расширения
    3. swizzling [Пример]

Перед Swift v4 dynamic включены @objc

При взаимодействии необходимо учитывать два ключевых слова:

В Swift 3 и ранее dynamic также подразумевается @objc, Новое в Swift 4, dynamic означает только динамическую диспетчеризацию и ничего не говорит о видимости Objective-C.

Однако не существует такой вещи, как динамическая диспетчеризация Swift; у нас есть только динамическая диспетчеризация Objective-C. Это означает, что вы не можете иметь только динамический, и вы должны написать @objc dynamic, Так что это фактически та же самая ситуация, что и прежде, только что сделанная явной.

Узнайте больше здесь

Другие вопросы по тегам