> Что такое паттерн 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 в разных экранах. Минусы: при маленьких проектах это может быть избыточно - добавляется лишний слой абстракции.
Пример кода
SWIFTprotocol UseCase {associatedtype Requestassociatedtype Responsefunc execute(_ request: Request) async throws -> Response}struct FetchUserProfileUseCase: UseCase {typealias Request = UserIDtypealias Response = UserProfileprivate let repository: UserRepositoryProtocolinit(repository: UserRepositoryProtocol) {self.repository = repository}func execute(_ request: UserID) async throws -> UserProfile {// здесь может быть дополнительная бизнес-логикаlet dto = try await repository.fetchProfile(userID: request)return dto.toDomain()}}
Использование в ViewModel:
SWIFTfinal class ProfileViewModel {private let fetchProfile: FetchUserProfileUseCasefunc 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.
> Похожие задачи по mobile
Как понять, что файл на сервере изменился при сохранении имени и пути?
Что такое диплинкинг в iOS
Что выведется в консоли при вызове двух одинаковых функций в протоколе с табличной диспетчеризацией
Какие подходы по обеспечению безопасности мобильного приложения и инфраструктуры применить
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью