Что такое непрозрачные типы (opaque types) в Swift?

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

Ответ

Непрозрачный тип — это тип, возвращаемый функцией или свойством, который скрывает свою конкретную реализацию, но гарантирует соответствие определённому протоколу или набору ограничений. Объявляется с помощью ключевого слова some.

Основная цель: Предоставить абстракцию, сохраняя типобезопасность и информацию о типах для компилятора.

Пример:

protocol Shape {
    func draw() -> String
}

struct Square: Shape { func draw() -> String { return "Square" } }
struct Circle: Shape { func draw() -> String { return "Circle" } }

// Функция возвращает `some Shape` (непрозрачный тип)
func makeShape() -> some Shape {
    // Компилятор знает, что возвращается именно `Square`,
    // но для внешнего кода это просто `some Shape`.
    return Square()
}
let shape: some Shape = makeShape() // Тип: some Shape, значение: Square

Ключевые правила:

  1. Все пути выполнения функции должны возвращать один и тот же конкретный тип (например, только Square или только Circle, но не оба в зависимости от условия).
  2. Непрозрачные типы можно использовать только как возвращаемый тип или тип вычисляемого свойства (не как тип параметра).
  3. Они часто применяются в сочетании с associatedtype в протоколах, когда невозможно вернуть просто Protocol из-за требований к типам.

Сравнение: some Protocol даёт больше информации компилятору, чем Protocol, что позволяет использовать протоколы с associatedtype в качестве возвращаемых типов.