Что такое тип `any` в Swift?

«Что такое тип `any` в Swift?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

any — это экзистенциальный тип (existential type) в Swift, который представляет собой контейнер для значения любого конкретного типа, соответствующего протоколу. Он введен для явного указания на использование стирания типа (type erasure).

Основная цель: Обеспечить возможность хранения гетерогенных коллекций объектов, соответствующих одному протоколу, с явным указанием на динамическую диспетчеризацию.

Пример:

protocol Drawable {
    func draw()
}

struct Circle: Drawable { func draw() { print("Рисую круг") } }
struct Square: Drawable { func draw() { print("Рисую квадрат") } }

// Коллекция экзистенциальных типов
let shapes: [any Drawable] = [Circle(), Square()]
for shape in shapes {
    shape.draw() // Динамический вызов метода
}
// Вывод:
// Рисую круг
// Рисую квадрат

Ключевые особенности и сравнение с some:

Критерий any Protocol some Protocol
Семантика "Любой тип, соответствующий протоколу" (экзистенциальный) "Конкретный, но неизвестный тип" (непрозрачный)
Гибкость Позволяет создавать гетерогенные коллекции ([any Drawable]). Требует, чтобы все значения в коллекции были одного конкретного типа.
Производительность Может требовать дополнительных затрат на упаковку (boxing) и динамическую диспетчеризацию. Позволяет компилятору проводить статическую оптимизацию.
Использование Когда нужна динамическая гибкость во время выполнения. Когда тип скрыт для абстракции, но фиксирован для компилятора (например, возвращаемый тип).

Важно: Используйте any осознанно, когда действительно требуется динамическое поведение. Для локальных абстракций часто предпочтительнее использовать дженерики (generics) или непрозрачные типы (some) из-за их лучшей производительности и безопасности типов.