← Назад к вопросам

Что такое enum?

1.0 Junior🔥 271 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое enum (перечисление) в Swift

Enum (перечисление) — это фундаментальный тип данных в Swift, который позволяет определить группу связанных значений и работать с ними типобезопасным образом. В отличие от других языков, перечисления в Swift — это полноценные типы первого класса с расширенными возможностями.

Базовое определение и синтаксис

// Простейший enum
enum CompassDirection {
    case north
    case south
    case east
    case west
}

// Использование
var direction: CompassDirection = .north
direction = .east

// Более компактная запись
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Ключевые особенности enum в Swift

  1. Типобезопасность — компилятор проверяет, что вы работаете только с допустимыми значениями перечисления:
let planet: Planet = .earth
// planet = .pluto // Ошибка компиляции: такого case не существует
  1. Ассоциированные значения — каждый case может хранить дополнительные данные разных типов:
enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

let productBarcode = Barcode.upc(8, 85909, 51226, 3)
let qrBarcode = Barcode.qrCode("ABCDEFGHIJKLMNOP")
  1. Исходные значения (raw values) — автоматически присваиваемые значения для каждого case:
enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

// Автоматическая генерация raw values
enum PlanetNumber: Int {
    case mercury = 1, venus, earth, mars // earth = 3, mars = 4
}
  1. Рекурсивные перечисления — case, которые могут хранить ассоциированные значения того же типа перечисления:
indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Методы и свойства в enum

Перечисления в Swift могут содержать методы, вычисляемые свойства и даже инициализаторы:

enum TrafficLight {
    case red, yellow, green
    
    var description: String {
        switch self {
        case .red: return "Stop"
        case .yellow: return "Get ready"
        case .green: return "Go"
        }
    }
    
    mutating func next() {
        switch self {
        case .red: self = .green
        case .yellow: self = .red
        case .green: self = .yellow
        }
    }
}

var light = TrafficLight.red
print(light.description) // "Stop"
light.next()
print(light.description) // "Go"

Практическое применение

Enum используются в iOS разработке для:

  • Обработки состояний — управление состояниями UI, загрузки данных, навигации
  • Группировки констант — замена "магических чисел" и строк
  • Обработки ошибок — типобезопасное представление ошибок
  • Паттернов проектирования — реализация State, Strategy и других паттернов
  • Работы с сетью — описание методов HTTP, кодов ответов, типов контента

Пример из реальной практики

enum APIError: Error {
    case invalidURL
    case networkError(Error)
    case decodingError(Error)
    case serverError(statusCode: Int)
    case unauthorized
    case notFound
}

enum ViewState {
    case loading
    case content([Item])
    case error(APIError)
    case empty
}

func handleState(_ state: ViewState) {
    switch state {
    case .loading:
        showLoadingIndicator()
    case .content(let items):
        displayItems(items)
    case .error(let error):
        showError(error)
    case .empty:
        showEmptyState()
    }
}

Преимущества использования enum

  • Безопасность — исключаются недопустимые значения на этапе компиляции
  • Читаемость — код становится самодокументируемым
  • Поддержка IDE — автодополнение и проверка типов
  • Производительность — оптимизация компилятором (часто хранятся в стеке)
  • Сопоставление с образцом (pattern matching) — мощный механизм через switch

В Swift перечисления — это не просто набор констант, а полноценный инструмент моделирования данных, который способен значительно улучшить архитектуру приложения, сделать код безопаснее и выразительнее. Правильное использование enum является одним из признаков качественного Swift-кода.