Вкратце, при использовании Xcode 9 Beta я столкнулся со следующим предупреждением:
Использование Swift 3 @objc в режиме Swift 4 не рекомендуется. Обратите внимание на устаревшие предупреждения @objc, проверьте ваш код с включенным ведением журнала «Использование устаревшего Swift 3 @objc» и отключите Swift 3 @objc. **
После некоторых исследований я все еще не знаю, как решить проблему. Я был бы очень признателен за любые советы о том, как решить эту проблему, а также объяснение того, что происходит.
Моя цель - лучше понять, что происходит с моим кодом.
swift
swift4
xcode9-beta
Далек
источник
источник
Ответы:
Я избавился от этого предупреждения, изменив настройку сборки «Swift 3 @objc Inference» моих целей на «По умолчанию».
Из этой статьи :
Пожалуйста, также обратитесь к этому предложению Swift для получения дополнительной информации.
источник
@objc
вывода Swift 3 в режиме Swift 4 не рекомендуется. Пожалуйста, устраните устаревшие@objc
предупреждения вывода, протестируйте свой код с@objc
включенным ведением журнала « Использование устаревшего вывода Swift 3 » и отключите вывод Swift 3@objc
». Есть идеи, где включить регистрацию Swift 3@objc
?- Что такое
@objc
вывод? Что здесь происходит?В
Swift 3
, компилятор выводит@objc
в нескольких местах, так что вам не придется. Другими словами, это обязательно добавит@objc
для вас!В
Swift 4
, компилятор больше не делает это (так много). Теперь вы должны добавить@objc
явно.По умолчанию, если у вас есть проект до Swift 4, вы получите предупреждения об этом. В проекте Swift 4 вы получите ошибки сборки. Это контролируется
SWIFT_SWIFT3_OBJC_INFERENCE
настройкой сборки. В проекте до Swift 4 это установлено наOn
. Я бы порекомендовал установить это значениеDefault
(илиOff
), которое теперь является параметром по умолчанию для нового проекта.Конвертация всего займет некоторое время, но поскольку это Swift 4 по умолчанию, его стоит сделать.
Я могу остановить предупреждения / ошибки компилятора?
Существует два способа преобразования вашего кода, чтобы компилятор не жаловался.
Один из них - использовать
@objc
каждую функцию или переменную, которые должны быть доступны среде выполнения Objective C:Другой заключается в использовании
@objcMembers
поClass
декларации. Это гарантирует автоматическое добавление@objc
ко ВСЕМ функциям и переменным в классе. Это простой способ, но он имеет свою стоимость, например, он может увеличить размер вашего приложения, предоставляя функции, которые не нужно показывать.- Что
@objc
и зачем это нужно?Если вы вводите новые методы или переменные в класс Swift, пометьте их как
@objc
выставляющие их для среды выполнения Objective-C. Это необходимо, если у вас есть код Objective C, который использует ваш класс Swift, или если вы используете функции типа Objective C, напримерSelectors
. Например, шаблон target-action:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Почему бы мне не отметить все
@objc
?Есть негативы, которые помечаются как
@objc
:Пожалуйста, имейте в виду, что это резюме очень высокого уровня и что оно сложнее, чем я написал. Я бы порекомендовал прочитать актуальное предложение для получения дополнительной информации.
Источники:
источник
@objc
не подразумевает динамическую диспетчеризацию, Swift может свободно использовать статическую или виртуальную диспетчеризацию (и, возможно, в результате выполнить другой код).dynamic
Ключевым слово требуется , чтобы заставить Swift использовать динамическую диспетчеризацию.@objc
уценено, что мы должны использовать?SWIFT_SWIFT3_OBJC_INFERENCE
вOn
. Конвертировать в Swift 4. Затем заняться@objc
вещами. Чтобы сделать это простым, следуйте основным правилам: ЕСЛИ класс Swift используется в коде Objc-C (через заголовок моста), используйте@objcMembers
, в противном случае, одно за другим добавление@objc
. Просто используйте поиск XCode, чтобы узнать, вызывается ли класс Swift из какого-либо.m
файла. Это должно сделать преобразование относительно безболезненным.@objc
в Swift 4 произошли изменения, а затем принять решение исправить проект и оставить его прежним.Migrator не может идентифицировать все функции, для которых нужны блоки @objc Inferred Objective-C, помеченные как устаревшие, чтобы помочь вам их найти.
• Создавать предупреждения о устаревших методах.
• Консольные сообщения при запуске устаревших блоков.
источник
У меня было это предупреждение с настройкой «Swift 3 @objc Inference» = «По умолчанию». Тогда я понял, что это было установлено для Проекта, а не для цели. Итак, убедитесь, что у вас есть настройка «Default» в вашей цели, чтобы избавиться от предупреждения.
источник
Вы можете просто перейти на «по умолчанию» вместо «ON». Кажется, более привержен к логике Apple.
(но все остальные комментарии об использовании
@obj
остаются в силе.)источник
Действительно, вы избавитесь от этих предупреждений, отключив Swift 3 @objc Inference. Тем не менее, могут возникнуть тонкие проблемы. Например, КВО перестанет работать. Этот код отлично работал под Swift 3:
После перехода на Swift 4 и установки по умолчанию «Swift 3 @objc Inference» некоторые функции моего проекта перестали работать . Мне потребовались некоторые отладки и исследования, чтобы найти решение для этого. Насколько я знаю, вот варианты:
Повторное включение вывода @objc оставляет вас с предупреждениями, но это самое быстрое решение. Обратите внимание, что он доступен только для проектов, перенесенных из более ранней версии Swift. Два других варианта более утомительны и требуют некоторого копания кода и тщательного тестирования.
Смотрите также https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
источник
Я случайный разработчик iOS (скоро будет больше), но я все еще не мог найти настройку, руководствуясь другим ответом (так как у меня не было этого элемента Keychain, который показывает ответ), так что теперь, когда я нашел его, я подумал Я мог бы просто добавить этот снимок с выделенными местами, которые вам нужно будет щелкнуть и найти.
источник
Вы можете попробовать "Pod update" и / или "flutter clean"
Я также установил эту настройку в xcode.
Настройка интерфейса Objective-C выглядит следующим образом:
источник
Swift 3 @objc Inference Использование Swift 3 @objc Inference в режиме Swift 4 не рекомендуется. Обратите внимание на устаревшие предупреждения @objc, проверьте ваш код с включенным ведением журнала «Использование устаревшего Swift 3 @objc», а затем отключите вывод, изменив настройку сборки «Swift 3 @objc Inference» на «По умолчанию» для «XMLParsingURL». цель.
добрался до
Первый шаг получил настройки сборки
Выполните поиск, чтобы построить вывод настроек
change swift 3 @objc Inference Default
введите описание изображения здесь
источник
Все, что вам нужно, это просто запустить тестовое ожидание до конца, после этого перейдите в «Настройка сборки», «Поиск в выводе параметров сборки», измените swift 3 @objc Inference на (по умолчанию). это все, что я делал и работал отлично.
источник
используйте func call @objc
источник
В дополнение к тому, что сказал @wisekiddo, вы также можете изменить настройки сборки в
project.pbxproj
файле, установив для параметра Swift 3 @obj Inference значение по умолчанию, какSWIFT_SWIFT3_OBJC_INFERENCE = Default;
для ваших вариантов сборки (т. Е. Отладка и выпуск), особенно если вы пришли из какой-то другой среды кроме Xcodeисточник