Executando verificação de segurança...
1

VIPER em SwiftUI Desvendado: Construa seu App de Tarefas

Navegando pelo VIPER em SwiftUI: Construa seu próprio aplicativo de tarefas

Olá, leitores! Neste artigo, iremos abordar um dos Design Patterns mais interessantes para desenvolvimento em SwiftUI: o VIPER. O nosso objetivo é entender a sua essência e aplicá-lo na criação de um aplicativo de tarefas.

1. O que é VIPER?

VIPER é um acrônimo para View, Interactor, Presenter, Entity e Router. É um padrão de design que busca melhorar a organização do código por meio da responsabilidade única, onde cada módulo tem uma tarefa específica.

  • View: A responsabilidade da View é exibir o que é dito pelo Presenter e transmitir as interações do usuário de volta para ele.
  • Interactor: O Interactor contém a lógica de negócios específica de um módulo.
  • Presenter: O Presenter atua sobre a View e o Interactor.
  • Entity: As Entities são os objetos básicos que são usados pelo Interactor.
  • Router: O Router lida com a navegação entre módulos.

2. Criando um aplicativo de tarefas com VIPER e SwiftUI

Agora que compreendemos o que cada componente faz em VIPER, vamos criar um aplicativo de tarefas. Vamos supor que temos um módulo chamado TasksModule, a estrutura seria assim:

/TasksModule
|-- /Entities
|   |-- Task.swift
|-- /Interactors
|   |-- FetchTasks.swift
|-- /Presenters
|   |-- TasksPresenter.swift
|-- /Views
|   |-- TasksView.swift
|-- /Routers
|   |-- TasksRouter.swift

Para o exemplo do nosso aplicativo, a entidade Task poderia ser algo como:

struct Task {
    let id: String
    let title: String
    let completed: Bool
}

Neste exemplo simples, Task é a entidade central do nosso aplicativo de tarefas, com um id, um título e uma propriedade booleana para verificar se a tarefa foi concluída.

Em seguida, temos o Interactor FetchTasks:

class FetchTasks {
    func execute() -> [Task] {
        // Aqui iríamos buscar as tarefas, possivelmente de um banco de dados ou serviço
    }
}

Na sequência, o TasksPresenter:

class TasksPresenter {
    let fetchTasks: FetchTasks
    weak var view: TasksView?

    init(fetchTasks: FetchTasks) {
        self.fetchTasks = fetchTasks
    }
    
    func viewDidLoad() {
        let tasks = fetchTasks.execute()
        view?.displayTasks(tasks)
    }
}

E então temos a TasksView:

struct TasksView: View {
    @ObservedObject var presenter: TasksPresenter

    var body: some View {
        List(presenter.tasks, id: \.id) { task in
            Text(task.title)
        }.onAppear(perform: presenter.viewDidLoad)
    }
}

Por último, o TasksRouter:

class TasksRouter {
    weak var currentView: TasksView?

    static func createModule() -> TasksView {
        let view = TasksView()
        
        let fetchTasks = FetchTasks()
        let presenter: TasksPresenter = TasksPresenter(fetchTasks: fetchTasks)
        
        fetchTasks.presenter = presenter
        presenter.view = view
        view.presenter = presenter
        
        return view
    }
}

Com este exemplo, demonstramos como a arquitetura VIPER pode ser utilizada em SwiftUI.

3. Conclusão

O padrão VIPER, quando aplicado corretamente, proporciona um alto nível de modularidade, tornando o código fácil de ler, manter e testar. Esperamos que este exemplo simples de um aplicativo de tarefas possa servir como ponto de partida para seus próprios projetos em SwiftUI.

Carregando publicação patrocinada...