Swinject Swift : guide complet avec exemples pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Swinject et pourquoi l'utiliser ?

Swinject est une bibliothèque légère d'injection de dépendances (Dependency Injection, DI) pour le langage Swift. Elle offre un moyen simple et déclaratif de gérer les dépendances entre objets, rendant le code plus modulaire, testable et maintenable.

Dans une approche traditionnelle, les objets créent eux-mêmes leurs dépendances, ce qui entraîne un couplage fort. Par exemple, une classe UserService pourrait instancier directement un NetworkClient. Si vous souhaitez remplacer NetworkClient par un objet mock pour les tests, vous devrez modifier le code de UserService. Swinject résout ce problème en déléguant la création et l'assemblage des objets à un conteneur dédié.

Principaux avantages de Swinject :

  • Réduction du couplage : Les classes ignorent comment leurs dépendances sont créées.
  • Testabilité améliorée : Remplacez facilement les dépendances réelles par des mocks et des stubs.
  • Configuration simplifiée : Toute la configuration des dépendances est centralisée.
  • Gestion du cycle de vie : Contrôle de la durée de vie des objets (singleton, nouvelle instance, etc.).
  • Architecture propre : Favorise le respect des principes SOLID, notamment le principe d'inversion des dépendances.

Swinject est particulièrement utile dans les projets de grande envergure où le nombre de classes et leurs dépendances augmentent, rendant la gestion manuelle complexe et sujette aux erreurs.

Installation de Swinject

Swinject s'installe via Swift Package Manager (SPM) ou CocoaPods. Nous allons voir les deux méthodes.

Installation avec Swift Package Manager (recommandée)

Dans Xcode, allez dans File → Add Packages.... Dans la barre de recherche, saisissez l'URL du dépôt : https://github.com/Swinject/Swinject.git. Choisissez la version souhaitée (généralement la dernière stable) et cliquez sur Add Package.

Vous pouvez également ajouter la dépendance directement dans votre fichier Package.swift :

// swift-tools-version:5.7
import PackageDescription

let package = Package(
    name: "YourProject",
    dependencies: [
        .package(url: "https://github.com/Swinject/Swinject.git", from: "2.8.0")
    ],
    targets: [
        .target(
            name: "YourTarget",
            dependencies: ["Swinject"])
    ]
)

Installation avec CocoaPods

Ajoutez cette ligne à votre Podfile :

pod 'Swinject', '~> 2.8'

Exécutez ensuite la commande pod install.

Remarque : Contrairement à Python (pip) ou Node.js (npm), Swift n'a pas de gestionnaire de paquets unique, mais SPM est la solution standard intégrée à Xcode.

Démarrage rapide avec un exemple de code

Prenons un exemple simple : nous avons un protocole LoggerProtocol et son implémentation ConsoleLogger. Nous voulons que la classe UserService reçoive le logger par injection de dépendances.

import Swinject

// 1. Définir le protocole
protocol LoggerProtocol {
    func log(message: String)
}

// 2. Implémentation du protocole
class ConsoleLogger: LoggerProtocol {
    func log(message: String) {
        print("LOG : \(message)")
    }
}

// 3. Classe utilisant la dépendance
class UserService {
    private let logger: LoggerProtocol

    // Injection via l'initialiseur
    init(logger: LoggerProtocol) {
        self.logger = logger
    }

    func createUser(name: String) {
        logger.log(message: "Création de l'utilisateur : \(name)")
        // Logique de création d'utilisateur
    }
}

// 4. Configuration du conteneur
let container = Container()
container.register(LoggerProtocol.self) { _ in ConsoleLogger() }
container.register(UserService.self) { r in
    UserService(logger: r.resolve(LoggerProtocol.self)!)
}

// 5. Utilisation
let userService = container.resolve(UserService.self)!
u                    

Recommendations