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.
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: