Что такое енам, роувелли и associated value
Перечисление (enum) в Swift — это тип, который группирует связанные значения и позволяет работать с ними типобезопасно. Оно может иметь raw values (базовые значения), associated values (ассоциированные значения) или и то, и другое. Raw values — это предустановленные значения одного типа для каждого случая, а associated values — это дополнительные данные, которые могут различаться по типу для каждого случая.
Raw Values
Raw values задаются при объявлении перечисления и имеют одинаковый тип для всех случаев. Они должны соответствовать протоколу RawRepresentable. Чаще всего используются строки, символы, целые числа и числа с плавающей точкой. Если тип raw value — Int, можно не указывать значения явно: они будут автоматически увеличиваться на 1, начиная с 0 (или с указанного значения).
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 позволяют хранить произвольные данные, связанные с конкретным случаем. Каждый случай может иметь свой набор ассоциированных значений разных типов. Это делает перечисления похожими на алгебраические типы данных и позволяет моделировать сложные состояния.
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 с сопоставлением образца:
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 — для сложных данных.
