Использование вывода Swift 3 @objc в режиме Swift 4 устарело?
Вкратце, при использовании Xcode 9 Beta я столкнулся с следующим предупреждением:
Использование вывода Swift 3 @objc в режиме Swift 4 устарело. Обращайтесь к устаревшим предупреждениям о запрете @objc, проверьте свой код с включенным протоколом "Использование устаревшего входа SWIFT 3 @objc" и отключите вывод SWift 3 @objc. **
После некоторых исследований я до сих пор не знаю, как исправить эту проблему.
Я был бы очень признателен за любые советы о том, как исправить эту проблему, а также объяснение того, что происходит.
Моя цель - понять лучшее понимание того, что происходит с моим кодом.
Ответы
Ответ 1
Я избавился от этого предупреждения, изменив настройку "Swift 3 @objc Inference" для моих целей на "По умолчанию".
![Отключить Swift 3 @objc inference в Xcode9]()
Из в этой статье:
Перед Swift 4 компилятор сделал несколько объявлений Swift, автоматически доступных Objective-C. Например, если один из подклассов из NSObject, компилятор создал Objective-C точки входа для всех методов в таких классах. Механизм называется выводом @objc.
В Swift 4 такой автоматический вывод @objc устарел, потому что это дорого, чтобы сгенерировать все эти точки входа Objective-C. Если для параметра "Swift 3 @objc Inference" установлено значение "On", он позволяет работать с старым кодом. Тем не менее, он будет показывать предупреждения об отказе, которые необходимо устранить. Рекомендуется "исправить" эти предупреждения и переключить параметр на "По умолчанию" , который по умолчанию используется для новых проектов Swift.
Дополнительную информацию см. это предложение Swift.
Ответ 2
- Что @objc
вывод @objc
? Что здесь происходит?
В Swift 3
компилятор выводит @objc
в нескольких местах, поэтому вам не придется этого делать. Другими словами, он обязательно добавит @objc
для вас!
В Swift 4
компилятор больше не делает это (столько). Теперь вы должны добавить @objc
явно.
По умолчанию, если у вас есть проект до Swift 4, вы получите предупреждения об этом. В проекте Swift 4 вы получите ошибки сборки. Это контролируется SWIFT_SWIFT3_OBJC_INFERENCE
сборки SWIFT_SWIFT3_OBJC_INFERENCE
. В проекте до Swift 4 это значение On
. Я бы порекомендовал установить для этого параметра значение " Default
(или " Off
), Которое теперь является значением по умолчанию для нового проекта.
Конвертация всего займет некоторое время, но так как он используется по умолчанию для Swift 4, его стоит сделать.
Я могу остановить предупреждения/ошибки компилятора?
Есть два способа преобразования вашего кода, чтобы компилятор не жаловался.
Одним из них является использование @objc
для каждой функции или переменной, которые должны быть доступны среде выполнения Objective C:
@objc func foo() {
}
Другой - использовать @objcMembers
в объявлении Class
. Это гарантирует автоматическое добавление @objc
ко ВСЕМ функциям и переменным в классе. Это простой способ, но он имеет свою стоимость, например, он может увеличить размер вашего приложения, предоставляя функции, которые не нужно показывать.
@objcMembers class Test {
}
- Что такое @objc
и почему это необходимо?
Если вы вводите новые методы или переменные в класс Swift, пометка их как @objc
предоставляет их среде выполнения Objective-C. Это необходимо, когда у вас есть код Objective C, который использует ваш класс Swift, или если вы используете функции типа Objective C, такие как Selectors
. Например, шаблон target-action: button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Почему бы мне не пометить все @objc
?
Существуют негативы, @objc
как @objc
:
- Увеличенный размер двоичного файла приложения
- Нет перегрузки функции
Пожалуйста, имейте в виду, что это резюме очень высокого уровня и что оно сложнее, чем я написал. Я бы порекомендовал прочитать актуальное предложение для получения дополнительной информации.
Источники:
Ответ 3
Мигратор не может идентифицировать все функции, которые нуждаются в @objc
Выведенный Objective-C thunks, помеченный как устаревший, чтобы помочь вам найти их
• Создавайте предупреждения об устаревших методах
• Консольные сообщения при запуске устаревших трюков
![введите описание изображения здесь]()
Ответ 4
Вы можете просто перейти к "по умолчанию" вместо "ON". Кажется, более привержен к логике Apple.
(но все остальные комментарии об использовании @obj
остаются в силе.)
Ответ 5
У меня было это предупреждение с настройкой "Swift 3 @objc Inference" = "По умолчанию". Тогда я понял, что это было установлено для Проекта, а не для цели. Итак, убедитесь, что у вас есть настройка "Default" в вашей цели, чтобы избавиться от предупреждения.
Ответ 6
Действительно, вы избавитесь от этих предупреждений, отключив 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
Ответ 7
Свифт 3 @objc Вывод
Использование вывода Swift 3 @objc в режиме Swift 4 устарело. Пожалуйста, обращайтесь к устаревшим предупреждениям о запрете @objc, протестируйте свой код с включенным протоколом "Использование устаревшего входа SWIFT 3 @objc", а затем отключите вывод, изменив параметр сборки "Swift 3 @objc Inference" на "Default" для "XMLParsingURL", мишени.
попал в
-
Первый шаг получил настройку сборки
-
Искать в построении вывода настроек
-
change swift 3 @objc Вывод по умолчанию
введите здесь описание изображения
Ответ 8
Использование Swift 3 @objc в режиме Swift 4 не рекомендуется?
используйте func call @objc
func call(){
foo()
}
@objc func foo() {
}
Ответ 9
Все, что вам нужно, это просто запустить тестовое ожидание до конца, после этого перейдите в "Настройка сборки", "Поиск в выводе настройки сборки", измените swift 3 @objc Inference на (по умолчанию). это все, что я делал и работал отлично.
Ответ 10
Я случайный разработчик iOS (скоро будет больше), но я все еще не мог найти настройку, руководствуясь другим ответом (так как у меня не было этого элемента Keychain, который показывает ответ), так что теперь, когда я нашел его, я подумал Я мог бы просто добавить этот снимок с выделенными местами, которые вам нужно будет щелкнуть и найти.
- Начало в верхнем левом углу
- Выберите значок папки проекта
- Выберите название своего основного проекта под значком папки проекта.
- Выберите Настройки сборки на правой стороне.
- Выберите ваш проект под ЦЕЛЕЙ.
- Прокрутка очень далеко вниз (или поиск слова в текстовом поле поиска)
![Finding the setting]()