Ответ
Enum (перечисление) — это тип, который определяет конечный набор связанных значений, обеспечивая типобезопасность и читаемость кода.
Ключевые особенности:
- Типобезопасность: компилятор проверяет корректность использования вариантов.
- Могут содержать методы, вычисляемые свойства и соответствовать протоколам.
- Поддерживают ассоциированные значения для хранения дополнительных данных.
- Имеют raw values (необработанные значения) строкового, символьного или целочисленного типа.
Пример базового enum:
enum CompassDirection {
case north
case south
case east
case west
}
let direction = CompassDirection.north
switch direction {
case .north: print("Север")
// ...
}
Пример с ассоциированными значениями:
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
let product = Barcode.upc(8, 85909, 51226, 3)
switch product {
case .upc(let numberSystem, let manufacturer, let productCode, let check):
print("UPC: (numberSystem)-(manufacturer)-(productCode)-(check)")
case .qrCode(let code):
print("QR: (code)")
}
Почему это важно: Enums идеальны для моделирования ограниченных вариантов (состояния, ошибки, типы данных), исключая недопустимые значения на этапе компиляции.
Ответ 18+ 🔞
Давай разберём этот ваш enum, а то читаю и чувствую, как мозг начинает потихоньку закипать, как каша. Ну, типа, перечисление, ёпта. Не просто список, а такой типобезопасный костыль, чтобы компилятор тебе мозги не выносил, когда ты вместо «севера» вдруг «запад» напишешь.
Представь, ты в тайге стоишь с компасом. У тебя вариантов-то — нихуя! Либо север, либо юг, либо запад, либо восток. Ну, вверх и вниз — это уже в космос, это другая история. Так вот, enum — это как раз про это. Ты заранее все возможные направления прописываешь, и потом, сука, никаких сюрпризов. Не прилетит тебе в код «юго-запад-на-пол-шага», потому что такого варианта нет, и компилятор тебя за это по ебалу настучит. Это и есть типобезопасность, блядь — когда ты защищён от собственной же ебанутой фантазии.
enum CompassDirection {
case north
case south
case east
case west
}
let direction = CompassDirection.north
switch direction {
case .north: print("Иди на север, там медведи меньше кусаются")
// ...
}
А теперь смотри сюда, самое интересное — ассоциированные значения. Это ж просто пиздец какой-то мощный инструмент! Ну, смотри: у тебя есть штрих-код. Он может быть или старый-добрый UPC из цифр, или новый, этот, QR, из строки. Так вот, вместо того чтобы городить хуйню с кучей полей и проверок, ты это впихиваешь в один enum!
enum Barcode {
case upc(Int, Int, Int, Int) // Четыре цифровых поля, старый формат
case qrCode(String) // А тут просто строка, новая хрень
}
let product = Barcode.upc(8, 85909, 51226, 3)
switch product {
case .upc(let numberSystem, let manufacturer, let productCode, let check):
print("UPC: (numberSystem)-(manufacturer)-(productCode)-(check)") // Разобрал на запчасти, красава
case .qrCode(let code):
print("QR: (code)") // А тут просто вывел строку
}
Во, видишь? В одном флаконе — два разных формата данных. И когда ты с этим работаешь через switch, ты точно знаешь, с чем имеешь дело. Не будет такого, что ты пытаешься вытащить четыре числа из QR-кода — компилятор опять же не даст, потому что он умный, блядь.
А зачем это всё, спросишь? Да затем, ёпта, чтобы жизнь была проще! Вместо того чтобы плодить кучу классов, структур и опционалов, ты красиво и безопасно описываешь конечный набор состояний. Ошибки приложения, состояния игрока, типы документов — да что угодно! Это как взять и навести порядок в своём цифровом хламе. Всё по полочкам, всё типобезопасно. И главное — если ты попробуешь вписать какую-то левую хуйню, Swift тебе сразу: «Э, сабака сука, э бошка думай! Такого варианта нет!». И ты сидишь, и исправляешь, вместо того чтобы потом, в рантайме, ловить ебанутый краш потому что «юго-запад-на-пол-шага».