Swift version: 5.6
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.
SAVE 50% To celebrate Black Friday, all our books and bundles are half price, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
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.