Enum у Swift — це тип, що об'єднує групу пов'язаних значень під одним іменем. На відміну від C і Objective-C, де enum — просто набір цілих констант, Swift пропонує first-class перелічення з associated values, raw values, методами та підтримкою протоколів. За даними Apple, 2026, enum — один із ключових інструментів типобезпечного моделювання станів в iOS-розробці.
Головне
Enum (перелічення) — це користувацький тип даних, який об'єднує кінцевий набір взаємовиключних варіантів. У Swift enum — це не просто числові константи, а повноцінний тип з власною логікою.
Кожен варіант перелічення називається кейсом. На відміну від Objective-C, де enum зводиться до цілого типу, Swift дозволяє кожному кейсу зберігати власні дані та мати методи.
За даними Apple, enum у Swift підтримує дженерики, ініціалізатори, обчислювані властивості та реалізацію протоколів — це робить його придатним для моделювання станів, помилок, опцій та кінцевих автоматів.
Використовуйте enum скрізь, де потрібно представити кінцеву множину взаємовиключних варіантів: стани екрана, типи помилок, напрямки, опції фільтрації.
Enum оголошується ключовим словом enum з наступним іменем та тілом у фігурних дужках.
enum CompassDirection {
case north
case south
case east
case west
}
Кейси можна оголошувати в один рядок через кому:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Для звернення до кейсу використовується крапковий синтаксис після відомого типу:
let direction = CompassDirection.north
// Тип відомий — доступний скорочений синтаксис:
var currentPlanet = .earth
Після присвоєння змінній відомого enum-типу Swift автоматично виводить тип, і можна опускати ім'я перелічення при зверненні до кейсів.
Raw Values — це значення одного типу, які призначаються кожному кейсу enum. На відміну від associated values, raw values однакові за типом для всіх кейсів і задаються при оголошенні.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
Для цілих raw values 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 дозволяють прив'язати різні типи даних до кожного кейсу перелічення індивідуально. На відміну від raw values, associated values можуть відрізнятися за типом і кількістю.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
При обробці через switch associated values витягуються через прив'язку до змінних або констант:
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 — перелічення, кейси якого посилаються на сам тип enum. Такі кейси позначаються ключовим словом indirect.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
Ключове слово indirect перед enum позначає всі кейси як рекурсивні. Альтернативно можна позначити indirect лише конкретний кейс:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift використовує indirect для зберігання рекурсивних кейсів як посилань (reference semantics) замість значень — це дозволяє уникнути нескінченного розміру enum на стеку. Рекурсивні enum широко застосовуються при побудові дерев, пов'язаних списків та AST.
Enum може реалізовувати протоколи так само, як структури та класи. Це ключова можливість протокол-орієнтованого програмування в 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 — тип з довільним набором властивостей. Enum не може мати stored properties, але підтримує computed properties та методи.
Ні, enum не може одночасно мати raw values і associated values. Raw values — це значення одного типу для всіх кейсів, associated values — індивідуальні дані для кожного кейсу. Ці механізми взаємовиключні.
Додайте відповідність протоколу CaseIterable. Swift автоматично згенерує властивість allCases, що повертає колекцію всіх кейсів у порядку оголошення. Це зручно для ітерації по всіх варіантах.
Switch — найбільш безпечний спосіб, оскільки компілятор перевіряє вичерпний перебір. Можна використовувати if case для перевірки одного кейсу або == для enum без associated values.
Так, enum підтримує дженерики: enum Result<T, E> { case success(T); case failure(E) }. Це дозволяє створювати типобезпечні узагальнені конструкції для обробки успіху та помилки.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також