Ответ
Протокол (Swift) и интерфейс (Java, C#, etc.) — оба определяют контракт (набор методов и свойств), который должен быть реализован другими типами. Ключевые различия лежат в возможностях.
| Аспект | Протокол (Swift) | Интерфейс (Классический, e.g., Java <8) |
|---|---|---|
| Реализация по умолчанию | Да, через расширения (extensions). | Нет (до Java 8). В Java 8+ — default методы. |
| Типы, которые могут соответствовать | Классы, структуры, перечисления. | Только классы (и record в C#). |
| Наследование | Протокол может наследовать несколько других протоколов. | Интерфейс может расширять несколько других интерфейсов. |
| Опциональные требования | Да, через модификатор @objc (только для совместимости с Objective-C). |
Нет, все методы обязательны (кроме default). |
| Хранение состояния (свойства) | Может требовать get/set свойств. Реализуется как вычисляемые или хранимые свойства. | Может требовать только get/set методы (фактически — свойства в C#). |
Пример протокола Swift с реализацией по умолчанию:
protocol Renderable {
func draw()
var opacity: Double { get set }
}
// Реализация по умолчанию через extension
extension Renderable {
func draw() {
print("Rendering with opacity (opacity)")
}
}
// Структура, использующая реализацию по умолчанию
struct Circle: Renderable {
var opacity: Double // Должна реализовать только свойство
// Метод draw() уже предоставлен расширением
}
Итог: Swift-протоколы более гибкие благодаря расширениям и поддержке value-типов (структур).