I am the author of iOS 17 Fundamentals, Building iOS User Interfaces with SwiftUI, and eight other courses on Pluralsight.
Deepen your understanding by watching!
Send a Type to Obedience School – Using Swift Extensions for Additional Protocol Conformance
Did you know that you can make any Type (here meaning Class, Enumeration, or Struct), even already-existing ones that you don’t have the source code for, adopt a protocol that it doesn’t normally conform to out of the box?
You can – even if you don’t have the original source code for that Type! It’s a powerful and intriguing proposition. Let’s explore how this is possible.
How, you ask?
Well, as the title of this article suggests, Swift extensions are the way to do it. To demonstrate this capability, consider the following scenario:
- You’re using a library that lets you create instances of
Bird, and you don’t have access to the source code for the library. Birdhas a property calledspeciesand a property calledcommonName.- You’d like
Birdto conform to the Printable protocol, defined in the Swift standard library, so that you can callprintln(_:)onBirdinstances, and have it log something useful to the console. - When
println(_:)is passed aBirdinstance, you’d like it to print out something like “[species] (ie, [commonName]).”, and have [species] and [commonName] be replaced by theBird‘s real values.
Remember that you don’t have access to the original source code of Bird . Without Swift extensions, there would be no way for you to tell the compiler that you’d like Bird to adopt and conform to the Printable protocol.
Thankfully, extensions do exist, and we can teach a Bird new tricks, enabling its conformance to Printable .
Protocol Conformance Extension
As stated in the Printable protocol documentation, a Type adopting the Printable protocol must implement a single, read-only property named description .
The extension, then would be implemented as follows:
1// Explicitly specify protocol adoption
2extension Bird: Printable {
3
4 // Implement the required property to make Bird conform to the protocol
5 var description: String {
6 return "\(species) (ie, \(commonName))"
7 }
8}
The magic line in the code above is highlighted. This tells the compiler that Bird will be extended to adopt the Printable protocol.
Of course, the remaining requirement then, is to implement the specification of the protocol so that Bird conforms to it, which is what the body of the extension contains.
Note that simply extending Bird to have a read-only description property will *not suffice for making the Type adopt the protocol. There is no “implicit” protocol adoption in Swift, so you must specify in the extension declaration that you intend for the Type to adopt the protocol.
Conclusion
With this little example, you’ve seen how using an extension can enable a Class, Enumeration, or Struct to adopt and conform to a protocol that it normally wouldn’t out of the box. It’s especially neat that you can do this for any such Type, whether you have control over its original source code or not.