- Что такое @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:
@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:
- Увеличенный размер двоичного файла приложения
- Нет перегрузки функции
Пожалуйста, имейте в виду, что это резюме очень высокого уровня и что оно сложнее, чем я написал. Я бы порекомендовал прочитать актуальное предложение для получения дополнительной информации.
Источники: