Swift version: 5.2
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 Would you describe yourself as knowledgeable, but struggling when you have to come up with your own code? Fernando Olivares has a new book containing iOS rules you can immediately apply to your coding habits to see dramatic improvements, while also teaching applied programming fundamentals seen in refactored code from published apps.
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.