Swinject para Swift: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Swinject e para que serve?

\n\n

Swinject é 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\n

Na 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.

\n\n

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
\n\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\n

Instalação do Swinject

\n\n

O Swinject é instalado via Swift Package Manager (SPM) ou CocoaPods. Vamos abordar ambos os métodos.

\n\n

Instalação via Swift Package Manager (recomendado)

\n

No 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.

\n\n

Alternativamente, você pode adicionar a dependência no seu Package.swift:

\n
// 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\n

Instalação via CocoaPods

\n

Adicione ao seu Podfile:

\n
pod 'Swinject', '~> 2.8'
\n

Em seguida, execute o comando pod install.

\n\n

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\n

Início rápido com exemplo de código

\n\n

Vamos 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.

\n\n
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.                    

Recommendations