The Separation of concerns is a principle for separating a computer program into distinct modules, where each module addresses a separate concern. A concern can be defined as a set of information or behavior that is part of a computer programming. An example could be persisting data in a store or calculating the discount to apply in an e-commerce app. A program that has an effective and clear separation of concerns is called modular.
Dependency Injection helps to reach the modularity of a software defining only the interface of the module so that the details of the implementation don't interfere with the business logic of the module. However, a loosely-coupled code isn't automatically obtained with DI, it needs to be carefully designed and planned.
A loosely-coupled code is easier to maintain, extend, debug, and test. A module could be replaced with a different implementation, changing a store engine from CoreData to Realm, without the modules having to be changed.