Loading repository data…
Loading repository data…
Nomi-ngj / repository
SampleCleanArchitecture is a modular iOS application designed as a reference architecture for building scalable, testable, and maintainable apps using UIKit and Swift.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
This is a modular and scalable iOS application built with Clean Architecture, SOLID principles, and modern Swift concurrency. The project demonstrates how to organize your app using feature-based modules (User), separating business logic, data handling, and presentation.
This project was created to help iOS developers structure real-world apps in a way that is testable, maintainable, and scalable. Whether you're working on a startup MVP or an enterprise-grade product, this example provides a clean and modular foundation.
├── Modules
│ ├── User
│ │ ├── Data
│ │ │ └── Remote
│ │ │ └── UserRemoteDataSource.swift
│ │ ├── Domain
│ │ │ ├── Entities
│ │ │ │ └── User.swift
│ │ │ ├── Repositories
│ │ │ │ └── UserRepository.swift
│ │ │ └── UseCases
│ │ │ └── GetUsersUseCase.swift
│ │ └── Presentation
│ │ ├── ViewModels
│ │ │ └── UserListViewModel.swift
│ │ ├── Views (SwiftUI)
│ │ │ └── UserListViewModel.swift
│ │ └── ViewControllers (UIKit)
│ │ └── UserListViewController.swift
│ ├── New Module
├── Shared
│ └── Networking
│ └── APIService.swift
└── Tests
├── DomainTests
│ └── GetUsersUseCaseTests.swift
└── DataTests
└── APIServiceTests.swift
UserListView displays a table view of usersUserListViewModel uses GetUsersUseCaseGetUsersUseCase uses UserRepositoryUserRemoteDataSource (conforming to UserRepository) fetches users via DefaultAPIServiceThis project includes unit tests for:
GetUsersUseCase)Run tests via:
⌘ + U (in Xcode)
SampleCleanArchitecture.xcodeproj in XcodeCopyright (c) 2025 Nouman Gul
This project demonstrates how to reuse the same UserListViewModel across SwiftUI and UIKit, allowing consistent business logic while maintaining separate UI layers.
let repo = UserRemoteDataSource()
let useCase = GetUsersUseCase(repository: repo)
let viewModel = UserListViewModel(getUsersUseCase: useCase)
UserListView(viewModel: viewModel)
let repo = UserRemoteDataSource()
let useCase = GetUsersUseCase(repository: repo)
let viewModel = UserListViewModel(getUsersUseCase: useCase)
let userListVC = UserListViewController(viewModel: viewModel)