Associated Values у Swift: що це, синтаксис та приклади

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

Associated Values — механізм Swift, що дозволяє прив'язати довільні дані до кожного варіанта enum індивідуально. На відміну від raw values, де всі кейси мають однотипні значення, associated values можуть відрізнятися за типом і кількістю для кожного кейса. За даними Apple Documentation, 2026, це ключова можливість для точного моделювання предметної області без створення додаткових типів-обгорток.

Головне

  • Associated Values — індивідуальні дані, прив'язані до кейса enum
  • Типи associated values можуть відрізнятися для кожного кейса
  • Видобування відбувається через прив'язку значень у switch або if case
  • Взаємовиключення — associated values несумісні з raw values
  • Практика — моделювання помилок, результатів запитів і станів UI

Що таке Associated Values?

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

Уявіть моделювання платіжного методу: кейс creditCard може зберігати останні 4 цифри та термін дії, а кейс applePay — нічого. З associated values це реалізується природно, без підкласів або опціональних полів.

За даними документації Apple, associated values перетворюють enum із простого набору констант в алгебраїчний тип даних (sum type), характерний для функціональних мов. Це суттєво підвищує виразність коду.

Синтаксис associated values

Associated Values оголошуються в круглих дужках після кейса із зазначенням імен і типів параметрів, як у функцій.

swift
enum MediaFile {
    case image(width: Int, height: Int, format: String)
    case video(duration: Double, codec: String)
    case audio(bitrate: Int)
    case unknown
}

При створенні екземпляра associated values передаються як аргументи:

swift
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")

Swift не накладає обмежень на кількість або типи associated values. Ви можете використовувати дженерики, функції-замикання та інші enum всередині associated values. Це робить можливим побудову складних вкладених структур.

Імена параметрів associated values використовуються як мітки аргументів при створенні екземпляра — це покращує читабельність коду. При видобуванні через switch імена слугують документацією, пояснюючи сенс кожного значення. Такий підхід робить код самодокументованим і знижує ймовірність помилок при зіставленні даних. Це особливо цінно в командній розробці великих iOS-застосунків.

Switch з associated values

Switch — основний спосіб видобування associated values. Значення прив'язуються до констант або змінних через let або var.

swift
func describe(_ file: MediaFile) -> String {
    switch file {
    case .image(let w, let h, let fmt):
        return "Image \(w)x\(h) .\(fmt)"
    case .video(let duration, let codec):
        return "Video \(duration)s, \(codec)"
    case .audio(let bitrate):
        return "Audio \(bitrate)kbps"
    case .unknown:
        return "Unknown format"
    }
}

Swift підтримує часткове зіставлення — можна вказувати конкретні значення associated values:

swift
switch file {
case .image(let w, let h, "png"):
    print("PNG-зображення \(w)x\(h)")
case .image(1920, 1080, _):
    print("Зображення Full HD")
default:
    break
}

Використання wildcard (_) дозволяє ігнорувати непотрібні associated values, а константи в кейсах — перевіряти на збіг із конкретними значеннями.

Associated Values vs Raw Values

Багато початківців плутають associated values із raw values. Це різні механізми з різними сценаріями застосування.

ХарактеристикаRaw ValuesAssociated Values
Тип данихОдин тип для всіх кейсівРізні типи для кожного кейса
Момент заданняПри оголошенні enumПри створенні екземпляра
Обов'язковістьВсі кейси мають значенняДеякі кейси можуть бути без значень
СумісністьВзаємовиключні — не можна використовувати одночасно

За даними Swift Evolution, associated values були введені в Swift 2.0 як частина редизайну enum. Вони забезпечують алгебраїчний підхід до типів, де кожен кейс — окремий конструктор із власною сигнатурою.

Практичні приклади associated values

Associated Values активно застосовуються в реальних iOS-проєктах. Розглянемо три типові сценарії.

Моделювання API-відповідей

swift
enum APIResponse<T: Codable> {
    case success(data: T, cached: Bool)
    case failure(error: Error, retryAvailable: Bool)
    case loading(progress: Double)
}

UI State Machine

swift
enum ViewState<T> {
    case idle
    case loading(message: String)
    case loaded(data: T)
    case error(message: String, retryAction: () -> Void)
}

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

Видобування через if case та guard case

Для перевірки одного кейса без switch використовуйте if case або guard case. Це компактніше, коли потрібно обробити лише один варіант.

swift
let error = NetworkError.timeout(seconds: 30)

if case .timeout(let seconds) = error {
    print("Час очікування запиту минув через \(seconds)s")
}

guard case .httpError(let code, _) = error else {
    return
}
print("Помилка HTTP з кодом \(code)")

Часто задавані питання

Чи може enum мати associated values без параметрів?

Так, кейс може не мати associated values — наприклад, case unknown. Такі кейси поводяться як звичайні enum-кейси без додаткових даних. Це зручно для маркерних станів.

Як порівняти два enum з associated values?

Swift не генерує Equatable автоматично для enum з associated values (до Swift 4.2+). Додайте явну реалізацію Equatable або використовуйте switch для почергового порівняння кожного кейса.

Чи можна використовувати associated values у рекурсивних enum?

Так, associated values в indirect enum — стандартний прийом для побудови дерев і зв'язаних списків. Кейс може містити associated value того ж типу з позначкою indirect.

Чим associated values відрізняються від опціональних властивостей у struct?

Associated Values типобезпечні — кожен кейс гарантовано має лише свої дані. У struct з опціоналами будь-який екземпляр містить усі поля, і потрібні runtime-перевірки на nil.

Чи підтримують associated values Codable?

Swift не генерує Codable автоматично для enum з associated values. Потрібна ручна реалізація encode та decode через switch по кейсах із використанням custom coding keys.

Підсумки

  • Associated Values — механізм прив'язки різних даних до кожного кейса enum
  • Синтаксис — оголошення параметрів у дужках після кейса, як у функцій
  • Видобування через switch з let-прив'язкою або if case
  • Несумісні з raw values — використовуйте щось одне
  • Дженерики в associated values роблять enum універсальним контейнером
  • State Machine — типовий сценарій для associated values в iOS

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

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

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

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