Swift version: 5.10
By default, all methods listed in a Swift protocol must be implementing in a conforming type. However, there are two ways you can work around this restriction depending on your need.
The first option is to mark your protocol using the @objc
attribute. While this means it can be adopted only by classes, it does mean you mark individual methods as being optional
like this:
@objc protocol ObjcPrintable {
@objc optional func canPrint() -> Bool
}
If possible, the second option is usually better: write default implementations of the optional methods that do nothing, like this:
protocol Printable {
func canPrint() -> Bool
}
extension Printable {
func canPrint() -> Bool {
return true
}
}
Remember, optional methods exist because you can provide sensible default behavior without them. In the above example it seems fair to make Printable
things return true from canPrint()
by default, because if someone wants to write an authentication layer for specific things they can implement their own version.
SPONSORED Debug 10x faster with Proxyman. Your ultimate tool to capture HTTPs requests/ responses, natively built for iPhone and macOS. You’d be surprised how much you can learn about any system by watching what it does over the network.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS 8.0 – learn more in my book Swift Design Patterns
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.