Dependency injection in iOS like a Pro

How to do Dependency injection in a smoother way?

Brahim Siempay
5 min readJan 3

--

Photo by Kelly Sikkema on Unsplash

What is Dependency injection?

Dependency injection is a software design pattern that allows you to decouple the different components of your app, making it easier to test and maintain. It involves injecting objects that a class depends on (its dependencies) into the class, rather than having the class create the dependencies itself.

How to use Dependency injection in an iOS app:

Let’s say you have a class called UserManager that retrieves user data from a server. The UserManager class has a dependency on an object called NetworkClient, which is responsible for making network requests. Instead of creating the NetworkClient object inside the UserManager, you can use dependency injection to pass the NetworkClient object into the UserManager when it is created.

Here is how the UserManager class might look with dependency injection:

class UserManager {
let networkClient: NetworkClient

init(networkClient: NetworkClient) {
self.networkClient = networkClient
}

func fetchUserData(completion: (Result<User, Error>) -> Void) {
networkClient.performRequest(...) { result in
// process the result and pass it to the completion handler
}
}
}

To use the UserManager class, you would create a NetworkClient object and pass it into the UserManager when it is created:

let networkClient = NetworkClient()
let userManager = UserManager(networkClient: networkClient)

By using dependency injection, you can easily swap out the NetworkClient object with a mock object when testing the UserManager, without having to modify the UserManager itself. This makes it easier to test the UserManager in isolation, and helps ensure that the UserManager is not tightly coupled to the NetworkClient.

Dependency injection like a Pro:

--

--

Brahim Siempay

Senior iOS engineer, Tech Geek, Writer, and Otako howtoinswift.tech