Экзистенциальные типы — это контейнеры со стёртым типом, которые могут содержать любое значение, соответствующее определённому протоколу. Они позволяют работать со значениями неизвестного конкретного типа через общий интерфейс протокола.
Экзистенциальные типы полезны, когда тебе нужна гибкость во время выполнения, особенно когда:
Например, коллекция [any Animal] может содержать любой объект, соответствующий Animal, независимо от его конкретного типа.
Экзистенциальные типы имеют заметные накладные расходы по сравнению с дженериками:
Когда производительность критична, предпочитай дженерики (<T: Protocol>) экзистенциалам — дженерики разрешаются на этапе компиляции без накладных расходов на упаковку.
До Swift 5.6 экзистенциальные типы писались без специального ключевого слова:
let animal: Animal // Старый синтаксис — неоднозначно
Swift 5.6 ввёл ключевое слово any, чтобы сделать использование экзистенциалов явным и осознанным:
let animal: any Animal // Новый синтаксис — понятно и обязательно
Это изменение улучшает читаемость кода, визуально отличая экзистенциальные типы от обычных конкретных типов или ограничений дженериков, и помогает разработчикам осознанно взвешивать связанные с этим компромиссы в производительности.
Используй any Protocol, когда требуется гибкость во время выполнения, но предпочитай дженерики, когда тип можно разрешить на этапе компиляции — ради лучшей производительности.
Экзистенциальные типы в Swift используют ключевое слово any для явного указания type erasure, которое стало обязательным синтаксисом в Swift 5.6, чтобы повысить ясность кода и сделать компромиссы производительности более осознанными.
Новый — ещё не проверен сообществом
Вы