What first led me into understanding Protocols With Associated Types (PATs)? Answer: RxSwift. It’s an awesome FRP framework for Swift.
What led me to the protocol compilation error “..can only be used as a generic constraint” which looks like this?
(Source: Alexis Gallagher – Protocols with Associated Types – 1:24)
Answer: Applying BDD (Behavior-Driven Development) to our Protocol Oriented MVVM RxSwift empowered code and using dependency injection.
We were going to use structs and protocols wherever we could. However, we had to back off some. Thanks to Alexis Gallagher, it’s clear now why we ran into the same problem that he presented in his video presentation, Protocols with Associated Types and how they got that way (maybe). Here’s a problem example he shows:
(Same source: 2:47)
This great presentation was part of the 2015 Functional Swift Conference. The Protocols with Associated Types, and How They Got That Way slides are available. However, I highly recommend listening to the whole presentation. Since it’s 56 minutes long, this blog post links to certain key parts of it with associated snapshot images just to give you a taste of what is in there.
From this presentation, there are some crucial key takeaways:
- Can’t use dynamic dispatch with PATs
- typealias can do two very different things
- There are workarounds if you need to do dynamic dispatch
Can’t Use Dynamic Dispatch With PATs
The compilation error “..can only be used as a generic constraint” described above shows how PATs are unique and different from plain old Protocols. The following dives into the ramifications of this situation:
(Same source: 6:54)
PATs are their own thing. As Alexis G. says, call them PATs and recognize how they are different.
typealias Can Do Two Very Different Things
(Same source: 11:39)
As specified in the Swift Language Reference on Declarations, you can use typealias to:
- Create a name for a type. See the “Type Alias Declaration” section.
- Require something that conforms to a PAT, to specify a type. See the “Protocol Associated Type Declaration” section
Slide 18 of his presentation has a good example of showing typealias being used in a PAT.
There Are Workarounds If You need to do Dynamic Dispatch
(Same source: 39:08)
Workarounds are:
- Enums
- Type Erasure
The future looks bright if they add Existentials to the language. There is a Stackoverflow post about the generic concept an Existential Type.
Summary
Until they add Existential Types to the Swift language, we should fully understand PATs and how to use other parts of the Swift language to accomplish what we want.
As an aside: If you got this far, you really may want to watch the whole presentation on youtube. This blog post was made to just catch some of the interesting bits for later referral. Enjoy!