В чем разница между протоколом в Swift и интерфейсом в языках типа Java или C#?

«В чем разница между протоколом в Swift и интерфейсом в языках типа Java или C#?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Протокол (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-типов (структур).