Dependency Injection via Protocol Composition
Watching Stephen Celis’ “How to Control the World”, NSSpain 2018 presentation, one of the common Swift/iOS patterns he brings up caught my attention.
It’s this piece of code:
protocol APIClientProvider {
var api: APIClientProtocol { get }
}
protocol DateProvider {
func date() -> Date
}
extension World: APIClientProvider, DateProvider {}
class MyViewController: UIViewController {
typealias Dependencies = APIClientProvider & DateProvider
let label = UILabel()
let dependencies: Dependencies
init(dependencies: Dependencies) {
self.dependencies = dependencies
}
func greet() {
self.dependencies.api.fetchCurrentUser { result in
if let user = result.success {
self.label.text = "Hi, \(user.name)! It’s \(self.dependencies.date())."
}
}
}
}
I never saw usage of a typealias Dependencies
declaration that uses Protocol Composition to declare which dependencies are needed (expressed as 1 type being the combination of all actual dependencies).
This was news to me, so I wonder if you ran into something like this out there in the wild.