Слои: предметная область, данные и представление
Отделяйте бизнес-логику от доступа к данным и интерфейса в приложении Swift.
«Слои: предметная область, данные и представление» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Чистая архитектура в Swift
Чистая архитектура разделяет код на слои: предметная область (бизнес-логика), данные (хранение и сеть) и представление (пользовательский интерфейс).
// Domain: pure Swift, no framework imports
// Data: Core Data / URLSession / JSON
// Presentation: SwiftUI / UIKitСлой предметной области
Слой предметной области содержит бизнес-сущности, варианты использования и протоколы репозиториев. Он не зависит от UIKit, SwiftUI или баз данных.
// Domain/Entities/User.swift
struct User {
let id: Int
var name: String
var email: String
}
// No import UIKit, no import SwiftDataВарианты использования в предметной области
Вариант использования инкапсулирует одну конкретную бизнес-операцию. Он зависит только от протоколов репозиториев предметной области.
// Domain/UseCases/FetchUserUseCase.swift
struct FetchUserUseCase {
let repo: UserRepository
func execute(id: Int) async throws -> User {
try await repo.getUser(id: id)
}
}Протоколы репозиториев в предметной области
Протоколы репозиториев определяют контракт доступа к данным. Предметная область владеет протоколом, а слой данных предоставляет его реализацию.
// Domain/Repositories/UserRepository.swift
protocol UserRepository {
func getUser(id: Int) async throws -> User
func saveUser(_ user: User) async throws
}Слой данных
Слой данных реализует протоколы предметной области с помощью конкретных технологий (сетевых сеансов, Core Data, SwiftData и Keychain).
// Data/Repositories/RemoteUserRepository.swift
struct RemoteUserRepository: UserRepository {
func getUser(id: Int) async throws -> User {
let data = try await URLSession.shared.data(from: userURL(id)).0
return try JSONDecoder().decode(User.self, from: data)
}
func saveUser(_ user: User) async throws { /* PUT request */ }
}Объекты передачи данных
DTO — это типы, используемые в слое данных для декодирования ответов API, после чего они преобразуются в сущности предметной области.
struct UserDTO: Decodable {
var user_id: Int
var full_name: String
func toDomain() -> User { User(id: user_id, name: full_name, email: "") }
}Слой представления
Слой представления содержит ViewModels и представления SwiftUI. Он вызывает варианты использования и предоставляет наблюдаемое состояние.
// Presentation/ViewModels/ProfileViewModel.swift
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var user: User?
private let useCase: FetchUserUseCase
init(useCase: FetchUserUseCase) { self.useCase = useCase }
func load(id: Int) async {
user = try? await useCase.execute(id: id)
}
}Направление зависимостей
Зависимости направлены внутрь: представление зависит от предметной области, а данные — от предметной области. Предметная область ни от чего не зависит.
// Outer → Inner dependency rule:
Presentation → Domain ← Data
// Domain is the stable core; outer layers are swappableСтруктура папок
В больших приложениях организуйте файлы Swift сначала по слоям, а затем по функциональным возможностям.
// MyApp/
// ├── Domain/
// │ ├── Entities/
// │ ├── UseCases/
// │ └── Repositories/ (protocols)
// ├── Data/
// │ └── Repositories/ (implementations)
// └── Presentation/
// ├── Views/
// └── ViewModels/Преимущества
Многоуровневая архитектура обеспечивает независимое тестирование, заменяемые реализации и параллельную разработку командой.
// Test Domain in isolation: no network, no DB
// Swap RemoteUserRepo with LocalUserRepo for offline mode
// Teams own layers independentlyРаспространённые ошибки
Не импортируйте UIKit или SwiftUI в слой предметной области и не допускайте проникновения бизнес-логики в представления.
// WRONG: Domain entity with SwiftUI Color
struct Product {
var color: Color // UIKit/SwiftUI import in Domain!
}
// CORRECT: Use a plain string or enum
struct Product { var colorHex: String }Быстрая проверка
Какой слой владеет протоколами репозиториев в чистой архитектуре?
Итоги урока
Слои чистой архитектуры: предметная область (сущности, варианты использования, контракты протоколов), данные (реализации сетевого взаимодействия и базы данных), представление (пользовательский интерфейс и ViewModels). Зависимости направлены внутрь, к предметной области. Предметная область не имеет зависимостей от фреймворков, поэтому её можно полностью тестировать модульными тестами.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Слои: предметная область, данные и представление» бесплатный?
Да — полный текст урока «Слои: предметная область, данные и представление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Слои: предметная область, данные и представление»?
Отделяйте бизнес-логику от доступа к данным и интерфейса в приложении Swift. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Слои: предметная область, данные и представление»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Слои: предметная область, данные и представление
- Шаблоны сценария использования и репозитория
- Инверсия зависимостей с абстракциями протоколов
- Связывание слоёв без фреймворка DI