Associated Values — механізм Swift, що дозволяє прив'язати довільні дані до кожного варіанта enum індивідуально. На відміну від raw values, де всі кейси мають однотипні значення, associated values можуть відрізнятися за типом і кількістю для кожного кейса. За даними Apple Documentation, 2026, це ключова можливість для точного моделювання предметної області без створення додаткових типів-обгорток.
Головне
Associated Values — це додаткова інформація, яку кейс enum може зберігати разом із собою. На відміну від raw values, які фіксовані на рівні оголошення, associated values задаються при створенні екземпляра enum.
Уявіть моделювання платіжного методу: кейс creditCard може зберігати останні 4 цифри та термін дії, а кейс applePay — нічого. З associated values це реалізується природно, без підкласів або опціональних полів.
За даними документації Apple, associated values перетворюють enum із простого набору констант в алгебраїчний тип даних (sum type), характерний для функціональних мов. Це суттєво підвищує виразність коду.
Associated Values оголошуються в круглих дужках після кейса із зазначенням імен і типів параметрів, як у функцій.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
При створенні екземпляра associated values передаються як аргументи:
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. Значення прив'язуються до констант або змінних через let або var.
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:
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 із raw values. Це різні механізми з різними сценаріями застосування.
| Характеристика | Raw Values | Associated Values |
|---|---|---|
| Тип даних | Один тип для всіх кейсів | Різні типи для кожного кейса |
| Момент задання | При оголошенні enum | При створенні екземпляра |
| Обов'язковість | Всі кейси мають значення | Деякі кейси можуть бути без значень |
| Сумісність | Взаємовиключні — не можна використовувати одночасно | |
За даними Swift Evolution, associated values були введені в Swift 2.0 як частина редизайну enum. Вони забезпечують алгебраїчний підхід до типів, де кожен кейс — окремий конструктор із власною сигнатурою.
Associated Values активно застосовуються в реальних iOS-проєктах. Розглянемо три типові сценарії.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
З associated values enum перетворюється на потужний інструмент для скінченних автоматів: кожен кейс — стан, associated values — параметри цього стану. Компілятор гарантує, що всі переходи оброблені.
Для перевірки одного кейса без switch використовуйте if case або guard case. Це компактніше, коли потрібно обробити лише один варіант.
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)")
Часто задавані питання
Так, кейс може не мати associated values — наприклад, case unknown. Такі кейси поводяться як звичайні enum-кейси без додаткових даних. Це зручно для маркерних станів.
Swift не генерує Equatable автоматично для enum з associated values (до Swift 4.2+). Додайте явну реалізацію Equatable або використовуйте switch для почергового порівняння кожного кейса.
Так, associated values в indirect enum — стандартний прийом для побудови дерев і зв'язаних списків. Кейс може містити associated value того ж типу з позначкою indirect.
Associated Values типобезпечні — кожен кейс гарантовано має лише свої дані. У struct з опціоналами будь-який екземпляр містить усі поля, і потрібні runtime-перевірки на nil.
Swift не генерує Codable автоматично для enum з associated values. Потрібна ручна реалізація encode та decode через switch по кейсах із використанням custom coding keys.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.