В чем разница между протоколом и typealias в Swift?

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

Ответ

Протокол — это полноценный тип, определяющий контракт (требуемые свойства, методы, индексаторы) для других типов. Используется для полиморфизма и ограничений дженериков.

Typealias — это псевдоним для существующего именованного типа или сложного составного типа. Не создает новый тип, лишь дает ему альтернативное имя для удобства и ясности.

Сравнение:

Критерий Протокол Typealias
Назначение Определение требований (интерфейса) Создание синонима для типа
Реализация Требует реализации (conformance) Не требует реализации
Новый тип Да, это отдельный тип-протокол Нет, это лишь имя
Использование Полиморфизм, ограничения дженериков Упрощение сложных сигнатур, семантика

Примеры:

// PROTOCOL: Определяет требование
protocol Serializable {
    func serialize() -> Data
}
// Класс должен реализовать метод
class User: Serializable {
    func serialize() -> Data { /* ... */ }
}

// TYPEALIAS: Создает понятное имя для сложного типа
typealias UserID = Int
typealias CompletionHandler = (Result<Data, Error>) -> Void

func fetchUser(by id: UserID, completion: CompletionHandler) {
    // `UserID` яснее, чем просто `Int`
    // `CompletionHandler` компактнее полной сигнатуры
}

// Typealias также может ссылаться на протокол с ограничениями
typealias CodableData = Codable & Identifiable

Итог: Протокол — это инструмент проектирования архитектуры, typealias — инструмент для улучшения читаемости кода.