Enum у Swift — що це, синтаксис і використання

Автор: IT Sectr Опубліковано: 2026-06-17 Час читання: 6 хв

Enum у Swift — це тип, що об'єднує групу пов'язаних значень під одним іменем. На відміну від C і Objective-C, де enum — просто набір цілих констант, Swift пропонує first-class перелічення з associated values, raw values, методами та підтримкою протоколів. За даними Apple, 2026, enum — один із ключових інструментів типобезпечного моделювання станів в iOS-розробці.

Головне

  • Enum — тип для групи пов'язаних значень, що забезпечує типобезпеку
  • Raw Values — однакові значення одного типу для всіх кейсів перелічення
  • Associated Values — різні типи даних, прив'язані до кожного кейсу індивідуально
  • Кейси оголошуються ключовим словом case і можуть містити методи
  • Switch з enum вимагає вичерпного перебору всіх варіантів компілятором

Що таке enum у Swift?

Enum (перелічення) — це користувацький тип даних, який об'єднує кінцевий набір взаємовиключних варіантів. У Swift enum — це не просто числові константи, а повноцінний тип з власною логікою.

Кожен варіант перелічення називається кейсом. На відміну від Objective-C, де enum зводиться до цілого типу, Swift дозволяє кожному кейсу зберігати власні дані та мати методи.

За даними Apple, enum у Swift підтримує дженерики, ініціалізатори, обчислювані властивості та реалізацію протоколів — це робить його придатним для моделювання станів, помилок, опцій та кінцевих автоматів.

Використовуйте enum скрізь, де потрібно представити кінцеву множину взаємовиключних варіантів: стани екрана, типи помилок, напрямки, опції фільтрації.

Синтаксис оголошення enum

Enum оголошується ключовим словом enum з наступним іменем та тілом у фігурних дужках.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

Кейси можна оголошувати в один рядок через кому:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Для звернення до кейсу використовується крапковий синтаксис після відомого типу:

swift
let direction = CompassDirection.north
// Тип відомий — доступний скорочений синтаксис:
var currentPlanet = .earth

Після присвоєння змінній відомого enum-типу Swift автоматично виводить тип, і можна опускати ім'я перелічення при зверненні до кейсів.

Raw Values у переліченнях

Raw Values — це значення одного типу, які призначаються кожному кейсу enum. На відміну від associated values, raw values однакові за типом для всіх кейсів і задаються при оголошенні.

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

Для цілих raw values Swift автоматично інкрементує значення, якщо явно задано лише перше:

swift
enum Status: Int {
    case pending = 1
    case active      // 2
    case completed   // 3
}

Raw values можуть бути типів Int, String, Character або будь-якого типу, що відповідає протоколу RawRepresentable. Swift автоматично генерує ініціалізатор init? для створення enum із raw value — це зручно при парсингу даних з API.

Associated Values в enum

Associated Values дозволяють прив'язати різні типи даних до кожного кейсу перелічення індивідуально. На відміну від raw values, associated values можуть відрізнятися за типом і кількістю.

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

При обробці через switch associated values витягуються через прив'язку до змінних або констант:

swift
let error = NetworkError.httpError(code: 403, message: "Forbidden")

switch error {
case .timeout(let seconds):
    print("Тайм-аут через \(seconds)s")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("Немає з'єднання")
case .unknown(let err):
    print("Невідомо: \(err.localizedDescription)")
}

За даними документації Apple, associated values роблять enum виразним інструментом для моделювання складних станів без створення окремих типів-обгорток. Використовуйте їх для Result-подібних сценаріїв та моделювання помилок із контекстом.

Рекурсивні enum (indirect)

Рекурсивний enum — перелічення, кейси якого посилаються на сам тип enum. Такі кейси позначаються ключовим словом indirect.

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

Ключове слово indirect перед enum позначає всі кейси як рекурсивні. Альтернативно можна позначити indirect лише конкретний кейс:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Swift використовує indirect для зберігання рекурсивних кейсів як посилань (reference semantics) замість значень — це дозволяє уникнути нескінченного розміру enum на стеку. Рекурсивні enum широко застосовуються при побудові дерев, пов'язаних списків та AST.

Enum і протоколи

Enum може реалізовувати протоколи так само, як структури та класи. Це ключова можливість протокол-орієнтованого програмування в Swift.

swift
protocol Describable {
    var description: String { get }
}

enum PaymentMethod: Describable {
    case creditCard(last4: String)
    case applePay
    case bankTransfer

    var description: String {
        switch self {
        case .creditCard(let last4):
            return "Card ending in \(last4)"
        case .applePay:
            return "Apple Pay"
        case .bankTransfer:
            return "Bank Transfer"
        }
    }
}

Enum також може реалізовувати протоколи Cocoa — наприклад, CaseIterable для автоматичної генерації колекції всіх кейсів або Codable для серіалізації. Це робить enum універсальним будівельним блоком у Swift-додатках.

Поширені запитання

Чим enum відрізняється від struct у Swift?

Enum — це тип з кінцевим набором взаємовиключних варіантів, а struct — тип з довільним набором властивостей. Enum не може мати stored properties, але підтримує computed properties та методи.

Чи може enum мати одночасно raw values і associated values?

Ні, enum не може одночасно мати raw values і associated values. Raw values — це значення одного типу для всіх кейсів, associated values — індивідуальні дані для кожного кейсу. Ці механізми взаємовиключні.

Як отримати масив усіх кейсів enum?

Додайте відповідність протоколу CaseIterable. Swift автоматично згенерує властивість allCases, що повертає колекцію всіх кейсів у порядку оголошення. Це зручно для ітерації по всіх варіантах.

Чи обов'язково використовувати switch для обробки enum?

Switch — найбільш безпечний спосіб, оскільки компілятор перевіряє вичерпний перебір. Можна використовувати if case для перевірки одного кейсу або == для enum без associated values.

Чи можна створити enum із дженериками?

Так, enum підтримує дженерики: enum Result<T, E> { case success(T); case failure(E) }. Це дозволяє створювати типобезпечні узагальнені конструкції для обробки успіху та помилки.

Підсумки

  • Enum у Swift — повноцінний тип з підтримкою методів, дженериків і протоколів
  • Raw Values дозволяють задати однакові значення одного типу для всіх кейсів
  • Associated Values дають можливість прив'язати різні дані до кожного кейсу
  • Indirect кейси необхідні для рекурсивних структур в enum
  • Протоколи можуть бути реалізовані enum — це основа POP у Swift
  • Switch з enum гарантує вичерпну обробку на рівні компіляції
  • Використовуйте enum для моделювання кінцевих станів і типобезпечних опцій

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також