Стирание типов (type erasure) — это техника, которая скрывает конкретный тип за интерфейсом протокола, открывая только поведение, определённое этим протоколом. Это позволяет тебе работать с разными конкретными типами единообразно, не раскрывая их специфические реализации.
Swift протоколы с ассоциированными типами или требованием Self нельзя использовать напрямую как типы переменных или параметры функций. Например, ты не можешь написать:
let items: [Equatable] // ❌ Не разрешено
Стирание типов решает эту проблему, оборачивая конкретный тип внутри generic класса или структуры, которая соответствует протоколу.
Обёртка для стирания типов:
Знакомый пример из фреймворков Apple — это AnyPublisher в Combine, который скрывает конкретную реализацию Publisher, сохраняя при этом его типы Output и Failure.
Реализуй стирание типов, когда тебе нужно:
struct AnyAnimal<Sound> {
private let _makeSound: () -> Sound
init<A: Animal>(_ animal: A) where A.Sound == Sound {
_makeSound = animal.makeSound
}
func makeSound() -> Sound { _makeSound() }
}
Примечание: В современном Swift (5.7+) ключевое слово any и primary associated types снижают необходимость в ручном стирании типов во многих распространённых случаях.
Type erasure позволяет хранить разнородные типы, соответствующие протоколу с associated types, в одной коллекции, оборачивая их в generic обёртку, которая перенаправляет вызовы протокола к подлежащему конкретному типу.
Новый — ещё не проверен сообществом
Вы