Swift version: 5.6
By default Swift generates code that is only available to other Swift code, but if you need to interact with the Objective-C runtime – all of UIKit, for example – you need to tell Swift what to do.
That’s where the @objc
attribute comes in: when you apply it to a class or method it instructs Swift to make those things available to Objective-C as well as Swift code. So, any time you want to call a method from a UIBarButtonItem
or a Timer
, you’ll need to mark that method using @objc
so it’s exposed – both of those, and many others, are Objective-C code.
Don’t worry: if you forget to add @objc
when it’s needed, your code simply won’t compile – it’s not something you can forget by accident and introduce a bug.
To expose a method to Objective-C, just write @objc
before its name like this:
class MyController: UIViewController {
@objc func authenticateUser() {
}
}
That whole class is automatically Objective-C friendly because it inherits from UIViewController
, but if you need it you can also explicitly make a class open to Objective-C by marking it @objc
.
TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS 8.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.