- iOS 15.0+ (minimum deployment target)
- Swift 5.9+ / Xcode 15+
- UIKit (pure, no SwiftUI)
- MVVM + Clean Architecture
- Layers: Domain → Data → Presentation
- Constructor-based dependency injection (no heavy DI frameworks)
| Library | Purpose | Version |
|---|---|---|
| SnapKit | Programmatic Auto Layout | latest |
| Kingfisher | Image loading + caching (Combine support) | latest |
- Combine — Reactive data binding, networking pipelines
- URLSession — HTTP networking (via
dataTaskPublisher) - Foundation — JSON decoding, caching
- Swift Package Manager (SPM) — Apple-native, Xcode-integrated
- PokeAPI v2 —
https://pokeapi.co/api/v2/ - No auth required, GET-only, fair use policy
- UserDefaults — Favorites list (simple key-value)
Pok-API/
├── Application/ # AppDelegate, SceneDelegate, DI Container
├── Domain/
│ ├── Entities/ # Pokemon, PokemonSpecies, EvolutionChain
│ ├── UseCases/ # FetchPokemonListUseCase, FetchPokemonDetailUseCase
│ └── Repositories/ # Repository protocols
├── Data/
│ ├── Network/ # APIClient, Endpoints
│ ├── DTOs/ # API response models
│ └── Repositories/ # Repository implementations
├── Presentation/
│ ├── PokemonList/ # VC, ViewModel, Cells
│ ├── PokemonDetail/ # VC, ViewModel, Views
│ ├── Search/ # Search VC, ViewModel
│ └── Common/ # Base classes, Extensions, Reusable views
└── Resources/ # Assets, LaunchScreen
- URLSession + Combine over Alamofire — Native, zero-deps, better for learning Combine
- Kingfisher over SDWebImage — Native Combine support, cleaner API
- SPM over CocoaPods — Apple standard, no extra tooling
- Feature-based folder structure — Each screen self-contained under Presentation/
- No heavy DI — Simple constructor injection, YAGNI