Swift Academy · Урок

Принципы проектирования на основе протоколов

Предпочитайте композицию протоколов наследованию классов для гибкого проектирования.

Урок 4 из 412 шагов

«Принципы проектирования на основе протоколов» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Протокол-ориентированное программирование (POP) отдаёт предпочтение композиции протоколов перед наследованием классов для создания гибкого, удобного для тестирования и повторно используемого кода на Swift.

Проблемы наследования

Глубокие иерархии классов создают проблемы: • Подклассы наследуют ALL: состояние и поведение суперкласса • Изменение суперкласса может нарушить работу подклассов • Нельзя наследоваться сразу от двух классов Протоколы решают все три проблемы.

Начните с протокола

```swift protocol Greetable { var greeting: String { get } func greet() } extension Greetable { func greet() { print(greeting) } // default implementation } ``` Расширения протоколов предоставляют реализации по умолчанию, которые любой соответствующий тип получает без дополнительного кода.

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

```swift protocol Persistable { func save() } protocol Networked { func fetch() async throws -> Data } protocol Loggable { func log(_ msg: String) } struct DataService: Persistable, Networked, Loggable { ... } ``` Сочетайте поведения как блоки LEGO — иерархия классов не нужна.

Расширения протоколов для общей логики

```swift extension Loggable { func log(_ msg: String) { print("[\(type(of: self))] \(msg)") } } // Every Loggable type gets this for free ```

Ретроактивное моделирование

Протоколы можно применять к типам, которыми Вы не владеете: ```swift protocol JSONConvertible { func toJSON() -> String } extension Int: JSONConvertible { func toJSON() -> String { "\(self)" } } ``` Добавляйте соответствия типам стандартной библиотеки без создания подклассов.

Типы-значения и протоколы

Структуры, соответствующие протоколам, дают Вам *и* семантику значений, *и* полиморфизм: ```swift protocol Shape { var area: Double { get } } struct Circle: Shape { var radius: Double; var area: Double { .pi * radius * radius } } struct Square: Shape { var side: Double; var area: Double { side * side } } let shapes: [any Shape] = [Circle(radius:3), Square(side:4)] shapes.map { $0.area } // [28.27, 16] ```

Внедрение зависимостей через протокол

```swift protocol DataStore { func save(_ data: Data) } struct FileStore: DataStore { func save(_ d: Data) { /* disk */ } } struct MockStore: DataStore { func save(_ d: Data) { /* test log */ } } class Service { let store: DataStore init(store: DataStore) { self.store = store } } ```

Когда использовать классы

Выбирайте классы, когда: • Вам нужно общее изменяемое состояние (семантика ссылок) • Требуется интеграция с API ObjC/UIKit • Наследование является подходящей моделью (что бывает редко) Во всех остальных случаях по умолчанию выбирайте протоколы и структуры.

Соглашения об именовании протоколов

• Протоколы возможностей: суффиксы `-able`, `-ible`, `-ing` (Equatable, Hashable, Coding) • Протоколы делегатов: суффикс `Delegate` или `DataSource` • Абстрактная роль: существительное (`Store`, `Parser`, `Renderer`) Хорошие имена делают протокол-ориентированный код понятным без дополнительной документации.

Быстрая проверка

Что расширения протоколов предоставляют соответствующим типам?

Итоги

Ключевые выводы: • Предпочитайте протоколы и структуры иерархиям классов • Расширения протоколов предоставляют общие реализации по умолчанию • Составляйте поведения из небольших протоколов, каждый из которых решает одну задачу • Протоколы позволяют внедрять зависимости для удобства тестирования • Оставляйте классы для семантики ссылок и взаимодействия с ObjC Курс завершён! Далее: типы-значения и ссылочные типы в подробностях.
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Принципы проектирования на основе протоколов» бесплатный?

Да — полный текст урока «Принципы проектирования на основе протоколов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Принципы проектирования на основе протоколов»?

Предпочитайте композицию протоколов наследованию классов для гибкого проектирования. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Принципы проектирования на основе протоколов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Композиция протоколов с помощью &
  2. Условное соответствие протоколам
  3. Требования Self и проектирование Equatable
  4. Принципы проектирования на основе протоколов
← Назад к Swift Academy