Swift version: 5.6
Protocol associated types let you add a huge amount of flexibility to your protocols, but sometimes you want a little less flexibility. For example, you might say that all types conforming to a protocol must specify the id
of their object and also what type that ID must be:
protocol Identifiable1 {
associatedtype ID
var id: ID { get set }
}
With that code, ID
could be anything – a String
, an Int
, a UILabel
, and so on. However, you might find you need to apply some constraints to that type: perhaps you need to use it as a dictionary key (Hashable
), or sort it in an array (Comparable
).
To make this work, Swift lets us apply constraints to associated types: “it can be any type, as long as that type conforms to…”. For example, this forces ID
to conform to Hashable
:
protocol Identifiable2 {
associatedtype ID: Hashable
var id: ID { get set }
}
Because Hashable
inherits from Equatable
we can now be sure that any types used for ID
can be compared using ==
and also used as keys in dictionaries.
TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!
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.