Протокол определяет контракт — набор требований (методов, свойств, инициализаторов), которые должен реализовать тип, соответствующий этому протоколу. Протоколы не имеют реализации большинства своих требований. Экземпляры протокола создать нельзя.
Абстрактный класс в языках, отличных от Swift (например, Java), представляет собой класс, который нельзя инстанцировать напрямую. Он содержит как реализованные методы (или свойства), так и абстрактные методы, которые должны быть реализованы в его подклассах.
В Swift нет концепции абстрактных классов в их традиционном понимании. Функциональность абстрактных классов в Swift достигается комбинацией протоколов и классов.
Используя протокол, можно определить интерфейс, а затем создать обычный класс, соответствующий этому протоколу и предоставляющий реализацию. Частичная реализация протокола может быть предоставлена с помощью расширений (protocol extensions), но это не делает протокол "абстрактным классом" в чистом виде.
| Протокол (Swift) | Абстрактный класс (традиционный) | |
|---|---|---|
| Назначение | Определение контракта (интерфейса) | Определение общего поведения и структуры с возможностью частичной реализации |
| Реализация | Как правило, не содержит реализации (кроме расширений) | Может содержать как реализованные, так и абстрактные методы |
| Инстанцирование | Нельзя создать экземпляр протокола | Нельзя создать экземпляр абстрактного класса напрямую |
| Наследование | Соответствие протоколу (conformance) | Наследование (inheritance) |
| Множественность | Тип может соответствовать нескольким протоколам | Класс может наследовать только от одного класса (в большинстве языков) |
| В Swift | Является основной формой абстракции | Прямого эквивалента нет, имитируется протоколами и классами |
Пример имитации абстрактного класса с помощью протокола и класса в Swift:
Протокол, определяющий абстрактные требования:
swift
Класс, соответствующий протоколу и предоставляющий реализации:
swift
Расширение для предоставления частичной реализации по умолчанию:
swift
Таким образом, в Swift протоколы играют ключевую роль в достижении полиморфизма и абстракции, заменяя концепцию абстрактных классов из других языков.