VIP (View–Interactor–Presenter) architecture — a modern Swift rewrite of the classic countries assignment, styled for fintech portfolio demos.
| Area | Implementation |
|---|---|
| VIP | Strict View → Interactor → Presenter boundaries |
| Concurrency | async/await country fetch |
| UI | Dark fintech presentation layer |
| Testing | Interactor unit tests without SwiftUI |
| Layer | Type | Role |
|---|---|---|
| View | CountriesView |
SwiftUI, user events, renders state |
| Interactor | CountriesInteractor |
Business logic, async data fetch |
| Presenter | CountriesPresenter |
Formats data for the view |
| Entity | Country |
Plain models |
| Router | (inline in app shell) | Navigation wiring |
Data flows View → Interactor → Presenter → View; the interactor never imports SwiftUI.
flowchart LR
V[CountriesView] --> I[CountriesInteractor]
I --> P[CountriesPresenter]
P --> V
I --> API[Country API / mock]
Replace docs/screenshots/countries-list.png with a loaded list capture (see docs/screenshots/README.md).
| Countries list |
|---|
![]() |
Screen recordings: Simulator → Record Screen.
xcodegen generate
open CountriesVIP.xcodeproj
# iPhone simulator → ⌘RCI: xcodebuild -project CountriesVIP.xcodeproj -scheme CountriesVIP -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build
Tests: ⌘U.
- Strict layer boundaries (testable interactors)
async/awaitloading- Presentation separated from domain logic
- Portfolio-friendly VIP reference implementation
Fintech-inspired — not affiliated with Revolut Ltd.
