Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : protocol, abstraction

Для чего в Swift используются протоколы?

Вопрос проверяет понимание абстракций в Swift и умение строить код, который легко расширять и тестировать.

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

Протоколы задают требования к типам: какие свойства и методы должны быть. Они помогают описывать поведение, а не конкретную реализацию. Это упрощает переиспользование кода и замену зависимостей. Протоколы часто применяются для архитектуры, тестирования и разделения ответственности. В Swift протоколы особенно важны, потому что их можно сочетать с расширениями и ограничениями.

Длинный ответ

Протоколы — один из ключевых инструментов Swift для построения гибкой архитектуры, потому что они позволяют описывать «что умеет объект», не привязываясь к тому, «что это за объект».

Определение

Протокол — это контракт, который описывает набор требований (методы, свойства, связанные типы), а конкретные типы могут ему соответствовать.

Зачем протоколы нужны на практике

Перед примерами важно разделить две задачи: описание поведения и уменьшение связности.

1. Описание поведения вместо конкретного типа

Когда код работает с протоколом, ему не важно, какой именно класс или структура внутри, важны только возможности.

Пример:

protocol AnalyticsTracking {
    func track(event: String)
}

Здесь любая реализация аналитики подходит, если умеет track.

2. Ослабление связности между слоями

Если экран напрямую зависит от конкретного сервиса, его сложно менять и тестировать. Протокол позволяет «развернуть» зависимость на уровень интерфейса.

Пример использования:

final class ProfileViewModel {
    private let analytics: AnalyticsTracking

    init(analytics: AnalyticsTracking) {
        self.analytics = analytics
    }

    func onAppear() {
        analytics.track(event: "profile_open")
    }
}

3. Тестируемость

В тестах можно подставлять заглушки и проверять поведение.

Пример заглушки:

final class AnalyticsSpy: AnalyticsTracking {
    var events: [String] = []
    func track(event: String) { events.append(event) }
}

4. Расширение функциональности через extension

Протоколы можно расширять, добавляя дефолтную реализацию.

Пример:

protocol IdentifiableView {
    static var reuseId: String { get }
}

extension IdentifiableView {
    static var reuseId: String { String(describing: Self.self) }
}

Теперь любые UITableViewCell, которые принимают протокол, получают reuseId без копипаста.

5. Композиция поведений

Можно собирать нужный набор возможностей через несколько протоколов, а не через сложное наследование.

Пример:

typealias CachableRequest = Encodable & Decodable

Частые места использования в iOS

  1. Сервисы: сеть, хранилище, аналитика.

  2. Слой навигации: роутеры/координаторы.

  3. UI-компоненты: конфигурация ячеек, обработка событий.

  4. Архитектура: разделение слоев на контракты.

Практический вывод

Протоколы стоит использовать, когда нужно отделить поведение от реализации: для тестируемости, расширяемости и снижения связности. Это один из самых сильных инструментов Swift для архитектуры.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Swift

    Swift

Ключевые слова

#protocol

#abstraction

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.