Photo by Michael Burrows from Pexels

Clean Architecture: iOS App

System Structure

-- Contacts
│── Presentation
│ └── Contact
│ ├── Create
│ │ ├── ContactCreateViewModel.swift
│ │ └── ContactCreateView.swift
│ ├── Edit
│ │ ├── ContactEditViewModel.swift
│ │ └── ContactEditView.swift
│ └── List
│ ├── ContactListViewModel.swift
│ └── ContactListView.swift
├── Domain
│ ├── Protocols
│ │ ├── UseCases
│ │ │ └── Contact
│ │ │ ├── CreateContactUseCaseProtocol.swift
│ │ │ ├── UpdateContactUseCaseProtocol.swift
│ │ │ ├── DeleteContactUseCaseProtocol.swift
│ │ │ ├── GetContactUseCaseProtocol.swift
│ │ │ └── GetAllContactsUseCaseProtocol.swift
│ │ └── Repositories
│ │ └── ContactRepositoryProtocol.swift
│ ├── Models
│ │ └── Contact.swift
│ ├── UseCases
│ │ └── Contact
│ │ ├── CreateContact.swift
│ │ ├── UpdateContact.swift
│ │ ├── DeleteContact.swift
│ │ ├── GetAllContacts.swift
│ │ └── GetOneContact.swift
│ └── Repositories
│ └── ContactRepositoryImpl.swift
└── Data
├── Protocols
│ ├── Wrappers
│ │ └── CoreDataWrapperProtocol.swift
│ └── ContactDataSourceProtocol.swift
└── DataSources
└── CoreData
├── Entities
│ └── Contact.xcdatamodeld
├── Wrappers
│ └── CoreDataWrapper.swift
└── CoreDataContactDataSource.swift
-- ContactTests
│── Mocks
│ ├── Domain
│ │ ├── Repositories
│ │ │ └── MockContactRepository.swift
│ │ └── UseCases
│ │ └── Contact
│ │ ├── MockCreateContact.swift
│ │ ├── MockUpdateContact.swift
│ │ ├── MockDeleteContact.swift
│ │ ├── MockGetAllContacts.swift
│ │ └── MockGetOneContact.swift
│ └── Data
│ └── DataSources
│ ├── MockContactDataSource.swift
│ └── CoreData
│ └── Wrappers
│ └── MockCoreDataWrapper.swift
│── Presentation
│ └── Contact
│ ├── Create
│ │ └── ViewModelContactCreateTests.swift
│ ├── Edit
│ │ └── ViewModelContactEditTests.swift
│ └── List
│ └── ViewModelContactListTests.swift
├── Domain
│ ├── UseCases
│ │ └── Contact
│ │ ├── UseCaseContactCreateTests.swift
│ │ ├── UseCaseContactUpdateTests.swift
│ │ ├── UseCaseContactDeleteTests.swift
│ │ ├── UseCaseContactsGetAllTests.swift
│ │ └── UseCaseContactGetOneTest.swift
│ └── Repositories
│ └── ContactRepositoryTests.swift
└── Data
└── DataSources
└── CoreDataContactDataSourceTests.swift

Contact Model

Protocols

Use Case Protocols

Contact Repository Protocol

Contact Data Source Protocol

View Model Tests

View Model

  1. The list of contacts,
  2. The error message,
  3. The “getContacts” function
  4. The “deleteContact” function

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store