Type erasure: в основном его заменил any P<T> 🔥
🔍 Самописные AnyFetcher существовали по одной причине: протокол с associatedtype нельзя было использовать как тип. С Swift 5.7 это почти неправда. Объявляете primary associated type — protocol Fetcher<Output> — и пишете [any Fetcher<User>] без всякой обёртки.
⚠️ Мелочь для точности, но её путают повсеместно: primary associated types — это SE-0346, а сам синтаксис any Fetcher<User> — SE-0353. SE-0346 прямым текстом отложил экзистенциалы: «это будет покрыто отдельным пропозалом». Плюс SE-0309 снял ограничение на протоколы с Self/associatedtype. Все три — Swift 5.7.
Когда обёртку всё же придётся писать руками: нужно стереть не-primary associated type (в угловые скобки лезут только primary); нужен value-тип поверх ссылочного; надо добавить или переформовать API, которого в протоколе нет; боксинг критичен на горячем пути. И про пример с Combine: он не задепрекейчен, но это Apple-only, закрытый исходник и почти без нового API много лет. Для новых вещей эталон — AsyncSequence, а eraseToAnyPublisher стоит показывать как историю, а не как идиому.