Наткнулся на пост в канале EasySwift iOS, где резюмировали хабровскую статью. Показался интересным такой глубокий разбор вроде бы простой темы — с пруфами и отличиями использования на уровне перформанса экзистенциальных типов и дженериков.
И что-то захотелсоь вспомнить и освежить работу: opaque types, existential types, type erasure, generics.
- как они соотносятся между собой;
- и где какую абстракцию применять.
Нагуглил, кажется, не плохую статью — Swift Type Abstraction: Generics, Opaque Types, Any, and Type Erasure Explained.
Интересно в ней то, что автор не просто описывает синтаксис, а объясняет, когда и зачем использовать каждый механизм:
- Generics — максимально производительный вариант (всё известно на этапе компиляции, вызывается напрямую, без динамики).
- Opaque types (
some) — позволяют скрывать конкретный тип, но при этом сохраняет статическую диспетчеризацию и производительность.- Existential types (
any) — гибче, чем opaque, дают возможность работать с разными типами через единый интерфейс (в том числе на коллекциях), но требуют динамической диспетчеризации (runtime cost).- Type erasure — паттерн, когда мы сами явно создаём обёртку, скрывающую конкретный тип за протоколом, чтобы преодолеть ограничения с
associatedtype и использовать протокол как тип.💡 От себя добавлю: именно
any и type erasure помогают обойти ограничения протоколов с associatedtype — дают возможность использовать такие протоколы в коллекциях, возвращаемых значениях или свойствах (работать с такими протоколами как типами, а не с констрейнтами).💡 Важно помнить: дженерики действительно быстры на рантайме, но за счёт компиляции под каждый конкретный тип увеличивают размер бинаря (потому что компилятор специализирует код под каждый тип). Поэтому баланс между производительностью и универсальностью здесь — ключевой.
P.S.: Думаю, стоит продолжить начитку в этом направлении — темы, которые логично пойдут следом:
- Как компилятор специализирует generics — Monomorphization.
- Как устроены witness tables и как происходит dispatch через них.
- Разные паттерны type erasure в Swift и в Foundation.
- Что такое primary associated types, как они работают и как влияют на абстракции.
#L #Swift #ExistentialTypes #Generics #TypeErasure
👏