Встречается на 36% собеседований по Mobile

Что такое енам, роувелли и associated value

Перечисление (enum) в Swift — это тип, который группирует связанные значения и позволяет работать с ними типобезопасно. Оно может иметь raw values (базовые значения), associated values (ассоциированные значения) или и то, и другое. Raw values — это предустановленные значения одного типа для каждого случая, а associated values — это дополнительные данные, которые могут различаться по типу для каждого случая.

Raw Values

Raw values задаются при объявлении перечисления и имеют одинаковый тип для всех случаев. Они должны соответствовать протоколу RawRepresentable. Чаще всего используются строки, символы, целые числа и числа с плавающей точкой. Если тип raw value — Int, можно не указывать значения явно: они будут автоматически увеличиваться на 1, начиная с 0 (или с указанного значения).

swift
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

let earthNumber = Planet.earth.rawValue // 3

Здесь mercury получает значение 1, venus — 2, earth — 3 и так далее. Raw values удобны, когда нужно сопоставить случаи с внешними данными (например, кодами ошибок или идентификаторами).

Associated Values

Associated values позволяют хранить произвольные данные, связанные с конкретным случаем. Каждый случай может иметь свой набор ассоциированных значений разных типов. Это делает перечисления похожими на алгебраические типы данных и позволяет моделировать сложные состояния.

swift
enum Barcode {
    case upc(Int, Int, Int, Int)   // четыре числа
    case qrCode(String)            // строка
}

var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

При извлечении associated values используется switch с сопоставлением образца:

swift
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let code):
    print("QR: \(code)")
}

Подводные камни

  • Raw values должны быть уникальными для каждого случая, иначе компилятор выдаст ошибку.
  • Associated values не могут быть использованы для сравнения перечислений через == напрямую — нужно реализовать соответствие протоколу Equatable вручную или использовать switch.
  • Перечисление с associated values не может иметь raw values одновременно (в Swift это взаимоисключающие возможности).
  • При добавлении нового случая в перечисление, все switch должны быть обновлены, иначе будет ошибка компиляции (это защита от пропущенных случаев).

Когда использовать

  • Raw values — когда нужно сопоставить случаи с фиксированными значениями, например, для сериализации или работы с внешними API.
  • Associated values — когда каждый случай должен нести уникальные данные, например, для моделирования состояний загрузки, результатов операций или сложных структур.

Коротко

  • enum группирует связанные значения и обеспечивает типобезопасность.
  • Raw values — предустановленные значения одного типа, задаются при объявлении.
  • Associated values — произвольные данные, уникальные для каждого случая.
  • Используйте raw values для фиксированных значений, associated values — для сложных данных.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы