--- frontmattername: ios-architecture
description: |
SwiftUI project structure. Use when creating new projects, new features, new screens, file placement, file naming, folder organization, code refactoring, ViewModel separation, standard directory structure, MVVM, Clean Architecture.
allowed-tools: Read, Grep, Glob, Bash
SwiftUI MVVM Structure
Table of Contents
1. Directory Structure
ProjectName/
├── App/
│ └── ProjectNameApp.swift
├── Core/
│ ├── Extensions/
│ ├── Utilities/
│ └── Network/
├── Features/
│ └── FeatureName/
│ ├── Views/
│ ├── ViewModels/
│ ├── Models/
│ └── Services/
├── .claude/shared/
│ ├── Components/
│ ├── Styles/
│ └── Modifiers/
├── Resources/
└── Tests/
Folder Purposes
| Folder | Purpose |
|---|
App/ | App entry point, app-level configuration |
Core/ | Shared code across app (Extensions, Network, Utilities) |
Features/ | Feature modules (Authentication, Home, Profile...) |
.claude/shared/ | Reusable UI components (Buttons, Cards, Modifiers) |
Resources/ | Assets, Localizable, Info.plist |
Tests/ | Unit tests, UI tests |
2. Naming Conventions
Folder Naming
- •
Features/ - Feature modules by functionality
- •
Core/ - App-wide shared code
- •
.claude/shared/ - Reusable UI components
- •
Services/ - Business logic, API services
- •
Resources/ - Assets, Localizable, Info.plist
File Naming
| Type | Convention | Example |
|---|
| View | [Feature]View.swift | LoginView.swift |
| ViewModel | [Feature]ViewModel.swift | LoginViewModel.swift |
| Model | [EntityName].swift | User.swift |
| Service | [Name]Service.swift | AuthService.swift |
| Extension | [Type]+Extensions.swift | String+Extensions.swift |
| Component | [DescriptiveName].swift | PrimaryButton.swift |
| Protocol | [Name]Protocol.swift | AuthServiceProtocol.swift |
Component Naming
| Type | Location | Example |
|---|
| Button | .claude/shared/Components/Buttons/ | PrimaryButton.swift |
| Input | .claude/shared/Components/Inputs/ | PrimaryTextField.swift |
| Card | .claude/shared/Components/Cards/ | ItemCard.swift |
| Modal | .claude/shared/Components/Modals/ | ConfirmationModal.swift |
| Feedback | .claude/shared/Components/Feedback/ | LoadingView.swift |
3. Organization Rules
MVVM Responsibilities
| Layer | Responsibility | Contains |
|---|
| View | UI only, no logic | SwiftUI views, layout, styling |
| ViewModel | State + business logic | @Published properties, methods |
| Model | Data structure only | Structs, Codable, Identifiable |
| Service | API + data persistence | Network calls, local storage |
Rules
- •Each feature is a separate folder in
Features/
- •Each feature has subfolders:
Views/, ViewModels/, Models/, Services/
- •View contains UI only, no business logic
- •ViewModel contains state and business logic
- •Model is data structure only
- •Service handles API and data persistence
- •Components in
.claude/shared/ are reusable across features
Dependencies Direction
View → ViewModel → Service → Model
↓ ↓ ↓
UI Logic Data
- •View depends on ViewModel
- •ViewModel depends on Service
- •Service depends on Model
- •Model has no dependencies
4. Feature Example
Authentication Feature
Features/
└── Authentication/
├── Views/
│ ├── LoginView.swift
│ ├── RegisterView.swift
│ └── Components/
│ ├── AuthHeader.swift
│ └── SocialLoginButtons.swift
├── ViewModels/
│ ├── LoginViewModel.swift
│ └── RegisterViewModel.swift
├── Models/
│ ├── User.swift
│ ├── LoginRequest.swift
│ └── LoginResponse.swift
└── Services/
├── AuthService.swift
└── AuthServiceProtocol.swift
File Contents Overview
| File | Contains |
|---|
LoginView.swift | UI layout, bindings to ViewModel |
LoginViewModel.swift | @Published state, login(), validate() |
User.swift | User struct with Codable |
AuthService.swift | API calls for login, register |
Checklist
When creating new feature:
When creating new screen:
When creating reusable component: