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
.
SPONSORED Let’s face it, SwiftUI previews are limited, slow, and painful. Judo takes a different approach to building visually—think Interface Builder for SwiftUI. Build your interface in a completely visual canvas, then drag and drop into your Xcode project and wire up button clicks to custom code. Download the Mac App and start your free trial today!
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.