De ce @objc în SWIFT 4?

Atunci când adăugăm o clauză @objc unei metode în Swift, aceasta din urmă devine accesibilă din Objective C. Bun, teoretic sună foarte riguros, dar dacă eu nu am nici un fel de cod Objective C în aplicație? Ar trebui să nu am nici o problemă, nu?

Swift 4 folosește încă în fundal foarte multe protocoale ObjectiveC.


UITableViewDataSource in ObjC

Ar trebui de fiecare dată când implementăm metodele din UITableViewDataSource să le specificăm fiecăreia un @objc. Swift 4 are grijă și nu ne forțează în acest sens.

Bun, și atunci unde și de ce am nevoie de @objc în cod Swift 4?

Cel mai bun exemplu în acest sens este o metodă care folosește un #selector. Avem nevoie să executăm o metodă loadRecordings după un delay de 0.5 secunde în thread-ul curent.

Pentru aceasta folosesc perform(_:with:afterDelay:), unde primul argument intern este un Selector, un struct ObjectiveC Runtime.

    perform(#selector(loadRecordings), with: nil, afterDelay: 0.5)

Deci selectorul din perform va trebui sa fie vizibil în runtime direct în ObjectiveC. Deci ar trebui ca metoda loadRecordings să aibe specificată o clauză @objc.
Deci prin deducție inversă, am ajuns la concluzia că trebuie să definesc astfel metoda loadRecordings

@objc func loadRecordings() {
.....
    }

Lipsa acestei clauze @objc îmi va genera o eroare la compilare așa cum se vede și mai jos:

Share Button

Stefan

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.