O que é Swinject e para que serve?
\n\nSwinject é uma biblioteca leve para injeção de dependências (Dependency Injection, DI) na linguagem Swift. Ela fornece uma maneira simples e declarativa de gerenciar dependências entre objetos, tornando o código mais modular, testável e sustentável.
\n\nNa abordagem tradicional, os objetos criam suas próprias dependências, o que leva a um forte acoplamento do código. Por exemplo, a classe UserService pode criar diretamente uma instância de NetworkClient. Se você quiser substituir NetworkClient por um objeto mock para testes, terá que alterar o código de UserService. O Swinject resolve esse problema, externalizando a criação e a ligação dos objetos em um contêiner separado.
Principais vantagens do Swinject:
\n- \n
- Redução do acoplamento: As classes não sabem como suas dependências são criadas. \n
- Melhora na testabilidade: Facilita a substituição de dependências reais por mocks e stubs. \n
- Simplificação da configuração: Toda a configuração das dependências é reunida em um único lugar. \n
- Suporte ao ciclo de vida: Gerenciamento do tempo de vida dos objetos (singleton, nova instância, etc.). \n
- Arquitetura limpa: Promove a adesão aos princípios SOLID, especialmente o Princípio da Inversão de Dependência. \n
O Swinject é especialmente útil em projetos grandes, onde o número de classes e suas dependências cresce, e o gerenciamento manual se torna complexo e propenso a erros.
\n\nInstalação do Swinject
\n\nO Swinject é instalado via Swift Package Manager (SPM) ou CocoaPods. Vamos abordar ambos os métodos.
\n\nInstalação via Swift Package Manager (recomendado)
\nNo Xcode, vá em File → Add Packages.... No campo de busca, insira a URL do repositório: https://github.com/Swinject/Swinject.git. Selecione a versão desejada (geralmente a última estável) e clique em Add Package.
Alternativamente, você pode adicionar a dependência no seu Package.swift:
// swift-tools-version:5.7\nimport PackageDescription\n\nlet package = Package(\n name: "YourProject",\n dependencies: [\n .package(url: "https://github.com/Swinject/Swinject.git", from: "2.8.0")\n ],\n targets: [\n .target(\n name: "YourTarget",\n dependencies: ["Swinject"])\n ]\n)\n\n\nInstalação via CocoaPods
\nAdicione ao seu Podfile:
pod 'Swinject', '~> 2.8'\nEm seguida, execute o comando pod install.
Nota: Diferente do Python (pip) ou Node.js (npm), o Swift não possui um gerenciador de pacotes único, mas o SPM é o padrão e integrado ao Xcode.
\n\nInício rápido com exemplo de código
\n\nVamos considerar um exemplo simples: temos um protocolo LoggerProtocol e sua implementação ConsoleLogger. Queremos que a classe UserService receba o logger através de injeção de dependência.
import Swinject\n\n// 1. Definindo o protocolo\nprotocol LoggerProtocol {\n func log(message: String)\n}\n\n// 2. Implementação do protocolo\nclass ConsoleLogger: LoggerProtocol {\n func log(message: String) {\n print("LOG: \\(message)")\n }\n}\n\n// 3. Classe que usa a dependência\nclass UserService {\n private let logger: LoggerProtocol\n\n // Injeção via inicializador\n init(logger: LoggerProtocol) {\n self.logger = logger\n }\n\n func createUser(name: String) {\n logger.log(message: "Creating user: \\(name)")\n // Lógica de criação do usuário\n }\n}\n\n// 4. Configuração do contêiner\nlet container = Container()\ncontainer.register(LoggerProtocol.self) { _ in ConsoleLogger() }\ncontainer.register(UserService.self) { r in\n UserService(logger: r.resolve(LoggerProtocol.