Swift Academy · Урок

Слои: предметная область, данные и представление

Отделяйте бизнес-логику от доступа к данным и интерфейса в приложении Swift.

Урок 1 из 413 шагов

«Слои: предметная область, данные и представление» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Слои: предметная область, данные и представление
  2. Шаблоны сценария использования и репозитория
  3. Инверсия зависимостей с абстракциями протоколов
  4. Связывание слоёв без фреймворка DI
← Назад к Swift Academy