- Що таке @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
. Наприклад, схема цільової дії:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Чому я б не відзначив усе @objc
?
Є негативи, які позначають щось як @objc
:
- Збільшений розмір бінарних програм
- Немає функцій перевантаження
Будь ласка, майте на увазі, що це резюме дуже високого рівня і що воно складніше, ніж я писав. Я рекомендую прочитати фактичну пропозицію для отримання додаткової інформації.
Джерела: