> Что такое паттерн use case (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: bnine

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Паттерн use case (или interactor) - это слой бизнес-логики между UI и репозиториями/сетью. Он инкапсулирует одно конкретное действие пользователя: "получить список", "сохранить профиль". В iOS на Swift обычно реализуется как класс или структура с единственным методом execute(). Use case делает код тестируемым, переиспользуемым и независимым от фреймворков.

Подробное объяснение

Use case - часть архитектуры Clean Architecture и VIPER. Он описывает, что система делает в ответ на действие пользователя, не вдаваясь в детали реализации. Например, use case FetchWeatherUseCase знает, что нужно запросить данные, но не знает, откуда они придут - из сети или кэша.

Основные принципы:

  • один use case = одно бизнес-правило или сценарий;
  • он не зависит от UIKit, SwiftUI или конкретной базы данных;
  • принимает входные параметры (request) и возвращает результат (response) через замыкание или async/await;
  • использует протоколы для зависимостей (репозиториев, сервисов), чтобы их можно было замокать в тестах.

В Swift это часто выглядит так: протокол UseCase, затем конкретная реализация, которая вызывает метод репозитория и преобразует данные в доменную модель.

На практике

В iOS-проекте use case обычно вызывается из ViewModel или Presenter. Например, экран профиля: ViewModel получает событие "загрузить профиль", вызывает LoadProfileUseCase, тот обращается к ProfileRepository, получает модель и возвращает её. ViewModel преобразует её в view state.

Плюсы: логика не размазана по контроллерам, легко писать unit-тесты, можно переиспользовать один use case в разных экранах. Минусы: при маленьких проектах это может быть избыточно - добавляется лишний слой абстракции.

Пример кода

SWIFT
protocol UseCase {
associatedtype Request
associatedtype Response
func execute(_ request: Request) async throws -> Response
}
struct FetchUserProfileUseCase: UseCase {
typealias Request = UserID
typealias Response = UserProfile
private let repository: UserRepositoryProtocol
init(repository: UserRepositoryProtocol) {
self.repository = repository
}
func execute(_ request: UserID) async throws -> UserProfile {
// здесь может быть дополнительная бизнес-логика
let dto = try await repository.fetchProfile(userID: request)
return dto.toDomain()
}
}

Использование в ViewModel:

SWIFT
final class ProfileViewModel {
private let fetchProfile: FetchUserProfileUseCase
func loadProfile() async {
do {
let profile = try await fetchProfile.execute(userID)
state = .loaded(profile)
} catch {
state = .error(error.localizedDescription)
}
}
}

Как отвечать на собеседовании

Начни с определения: use case - это слой бизнес-логики, который описывает одно действие пользователя. Затем объясни, зачем он нужен: разделение ответственности, тестируемость, независимость от UI. Приведи пример из своего опыта - например, как ты выносил загрузку данных из ViewController в отдельный класс. Если спросят про альтернативы, скажи, что в простых проектах можно обойтись без него, но в крупных это помогает поддерживать код.

Что проверяет интервьюер

Интервьюер хочет убедиться, что ты понимаешь:

  • зачем нужен слой абстракции между UI и данными;
  • как работает инверсия зависимостей (протоколы, DI);
  • как писать тестируемый код;
  • разницу между use case и repository/service.

Также проверяется умение объяснять архитектурные решения простыми словами и связывать их с реальными задачами.

Типичные ошибки

  • Путать use case с repository: репозиторий отвечает за доступ к данным, use case - за бизнес-логику.
  • Включать UIKit или SwiftUI в use case - он должен быть чистым.
  • Делать use case слишком большим, с несколькими методами - это уже сервис.
  • Не использовать протоколы для зависимостей, из-за чего сложно тестировать.
  • Забывать про обработку ошибок и возврат результата - use case должен явно сообщать об ошибке через throws или Result.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью