Вкратце, при использовании Xcode 9 Beta я столкнулся со следующим предупреждением:

Использование вывода Swift 3 @objc в режиме Swift 4 устарело. Обратитесь к устаревшим предупреждениям вывода @objc, проверьте свой код с включенным ведением журнала «Использование устаревшего вывода Swift 3 @objc» и отключите вывод Swift 3 @objc. **

После некоторого исследования я все еще не знаю, как решить эту проблему. Я был бы очень признателен за любые советы о том, как решить эту проблему, а также за объяснение того, что происходит.

Моя цель - лучше понять, что происходит с моим кодом.

DaleK

Ответов: 12

Ответы (12)

Все, что вам нужно, - это просто запустить тест, дождаться завершения, после чего перейти к настройкам сборки, найти в разделе «Вывод настроек сборки», измените swift 3 @objc Inference на (по умолчанию). это все, что я сделал и работал отлично.

Помимо того, что сказал @wisekiddo, вы также можете изменить настройки сборки в файле project.pbxproj, установив для Swift 3 @obj Inference значение по умолчанию, например SWIFT_SWIFT3_OBJC_INFERENCE = Default; для ваших вариантов сборки (например, отладки и выпуска), особенно если вы работаете в другой среде помимо Xcode

Вы можете просто перейти к «default» вместо «ON». Кажется, больше придерживается логики Apple.

(но все остальные комментарии об использовании @ obj остаются в силе.)

Мигратор не может определить все функции, которые нужны @ objc Предполагаемые Objective-C преобразователи, помеченные как устаревшие, чтобы помочь вам их найти
• Создавать предупреждения об устаревших методах
• Консольные сообщения при запуске устаревших преобразователей

enter image description here

У меня было это предупреждение с настройкой «Swift 3 @objc Inference» = «По умолчанию». Потом я понял, что это ставится под проект, а не на цель. Итак, убедитесь, что в вашей цели установлен параметр «По умолчанию», чтобы избавиться от предупреждения.

Использование вывода Swift 3 @objc в режиме Swift 4 устарело?

использовать вызов функции @objc

func call(){

foo()

}

@objc func foo() {

}

Действительно, вы избавитесь от этих предупреждений, отключив Swift 3 @objc Inference. Однако могут возникнуть тонкие проблемы. Например, перестанет работать КВО. Этот код отлично работал в Swift 3:

for (key, value) in jsonDict {
    if self.value(forKey: key) != nil {
        self.setValue(value, forKey: key)
    }
}

После перехода на Swift 4 и установки «Swift 3 @objc Inference» по умолчанию некоторые функции моего проекта перестали работать. Мне потребовались некоторые отладки и исследования, чтобы найти решение для этого. Насколько мне известно, вот варианты:

  • Включить «Swift 3 @objc Inference» (работает только в том случае, если вы перенесли существующий проект из Swift 3) enter image description here
  • Отметьте затронутые методы и свойства как @objc enter image description here
  • Повторно включить вывод ObjC для всего класса с помощью @objcMembers enter image description here

Повторное включение вывода @objc оставляет вам предупреждения, но это самое быстрое решение. Обратите внимание, что он доступен только для проектов, перенесенных из более ранней версии Swift. Два других варианта более утомительны и требуют некоторого изучения кода и обширного тестирования.

См. Также https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md

Я избавился от этого предупреждения, изменив настройку сборки «Swift 3 @objc Inference» для моих целей на «По умолчанию».

Disable Swift 3 @objc inference in Xcode9

От эта статья:

До Swift 4 компилятор делал некоторые объявления Swift автоматически доступными для Objective-C. Например, если один является подклассом NSObject, компилятор создает точки входа Objective-C для всех методов в таких классах. Механизм называется выводом @objc.

В Swift 4 такой автоматический вывод @objc устарел, потому что создание всех этих точек входа Objective-C обходится дорого. Когда для параметра «Swift 3 @objc Inference» установлено значение «Вкл.», Старый код будет работать. Однако он будет отображать предупреждения об устаревании, которые необходимо устранить. Рекомендуется «исправить» эти предупреждения и переключить настройку на «По умолчанию», которая используется по умолчанию для новых проектов Swift.

См. Также это предложение Swift для получения дополнительной информации.

Можно попробовать "Обновить под" и / или "очистить флаттером"

Я также установил этот параметр в xcode.

Настройка интерфейса Objective-C выглядит следующим образом:

ObjectiveC interface setting

Swift 3 @objc Inference Использование вывода Swift 3 @objc в режиме Swift 4 устарело. Обратитесь к устаревшим предупреждениям вывода @objc, проверьте свой код с включенным ведением журнала «Использование устаревшего вывода Swift 3 @objc», а затем отключите вывод, изменив настройку сборки «Swift 3 @objc Inference» на «По умолчанию» для «XMLParsingURL» цель.

попал в

  1. Первый шаг получил настройки сборки

  2. Искать в выводе настроек сборки

  3. изменить swift 3 @objc Inference по умолчанию

введите описание изображения здесь

I'm an occasional iOS dev (soon to be more) but I still couldn't find the setting as guided by the other answer (since I did not have that Keychain item the answer shows), so now that I found it I thought I might just add this snapshot with the highlighted locations that you will need to click and find.

  1. Начало в левом верхнем углу
  2. Выберите значок папки проекта
  3. Выберите название вашего основного проекта под значком папки проекта.
  4. Выберите «Настройки сборки» справа.
  5. Выберите свой проект в разделе ЦЕЛИ.
  6. Прокрутите очень далеко вниз (или найдите слово вывод в поиске текстовое поле)

Finding the setting

- Что такое вывод @ objc? Что происходит?

В Swift 3компилятор выводит @ objc в нескольких местах, так что вам не придется. Другими словами, он обязательно добавит @ objc для вас!

В Swift 4компилятор больше не делает этого (столько же). Теперь вы должны явно добавить @ objc.

По умолчанию, если у вас есть проект до Swift 4, вы получите предупреждение об этом. В проекте Swift 4 вы получите ошибки сборки. Это контролируется настройкой сборки SWIFT_SWIFT3_OBJC_INFERENCE. В проекте до Swift 4 это установлено на на.Я бы рекомендовал установить это значение Default (или Off), которое теперь является параметром по умолчанию в новом проекте.

Преобразование всего займет некоторое время, но, поскольку это значение по умолчанию для Swift 4, это стоит сделать.

- Как отключить предупреждения / ошибки компилятора?

Есть два способа преобразовать ваш код, чтобы компилятор не жаловался.

Один из них - использовать @ objc для каждой функции или переменной, которые должны быть доступны среде выполнения Objective-C:

@objc func foo() {

}

Другой - использовать @ objcMembers с помощью объявления Class. Это гарантирует автоматическое добавление @ objc к ALL функций и переменных в классе. Это простой способ, но у него есть свои затраты, например, он может увеличить размер вашего приложения, открывая функции, которые не нужно было раскрывать.

@objcMembers class Test {

}

- Что такое @ objc и зачем это нужно?

Если вы вводите новые методы или переменные в класс Swift, пометка их как @ objc предоставляет их среде выполнения Objective-C. Это необходимо, если у вас есть код Objective-C, который использует ваш класс Swift, или, если вы используете функции типа Objective-C, такие как Selectors. Например, шаблон целевого действия: button.addTarget (self, действие: #selector (didPressButton), для: .touchUpInside)

- Почему бы мне все не отметить @ objc?

Есть негативы, на которых что-то помечено как @ objc:

  • Увеличен размер двоичного файла приложения
  • Без перегрузки функций

Пожалуйста, имейте в виду, что это резюме очень высокого уровня и что оно сложнее, чем я написал. Я бы рекомендовал прочитать актуальное предложение для получения дополнительной информации.

Источники:

2022 WebDevInsider