Вопрос проверяет умение применять протоколы не теоретически, а в реальных задачах iOS-разработки.
Протоколы часто используются для сервисов, навигации, конфигурации UI и тестирования. Они позволяют скрыть детали реализации и работать через контракт. Это упрощает замену компонентов и снижает связность. Также протоколы помогают переиспользовать код через extensions. В реальных проектах они встречаются практически в каждом слое приложения.
В продакшн-коде протоколы появляются не «ради архитектуры», а потому что они решают конкретные проблемы поддержки и расширения кода.
Один из самых частых кейсов — абстракция сервисов.
protocol NetworkService {
func request<T: Decodable>(_ endpoint: Endpoint) async throws -> T
}
Преимущества:
ViewModel не знает, как именно выполняется запрос.
Реализацию можно заменить (URLSession, mock, stub).
Код легче тестировать.
Навигация часто выносится из контроллеров.
protocol ProfileRouting {
func openSettings()
}
Контроллер:
не знает, push это или present;
не управляет стеком напрямую.
Это уменьшает связность UI и навигации.
Протоколы удобно использовать для настройки ячеек и view.
protocol ConfigurableCell {
associatedtype Model
func configure(with model: Model)
}
Использование:
Ячейка знает только свою модель.
Таблица не зависит от конкретного типа ячейки.
Уменьшается количество if и кастов.
Delegate — это классический паттерн на протоколах.
Типичные кейсы:
Передача событий из view.
Обратная связь из кастомных компонентов.
Изоляция UI от бизнес-логики.
В тестах протоколы используются постоянно.
protocol AuthService {
func login() async throws
}
В тестах:
real service заменяется на mock;
проверяется поведение, а не реализация.
Протоколы + extensions позволяют убрать дублирование.
Пример:
protocol ReusableView {
static var reuseIdentifier: String { get }
}
extension ReusableView {
static var reuseIdentifier: String {
String(describing: Self.self)
}
}
Любая ячейка автоматически получает reuseIdentifier.
Протоколы чаще всего применяются для сервисов, навигации, UI-компонентов и тестов. Если в проекте почти нет протоколов — код, скорее всего, будет жестко связан и плохо масштабируем.