Ответ
Протокол — это полноценный тип, определяющий контракт (требуемые свойства, методы, индексаторы) для других типов. Используется для полиморфизма и ограничений дженериков.
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 — инструмент для улучшения читаемости кода.