Associated Values у Swift-у: шта је то, синтакса и примери

Аутор: IT Sectr Објављено: 2026-06-17 Време читања: 6 мин

Associated Values — механизам Swift-а који омогућава прикачивање произвољних података свакој варијанти enum-а појединачно. За разлику од raw values, где сви case-еви имају вредности истог типа, associated values могу да се разликују по типу и броју за сваки case. Према Apple Documentation, 2026, ово је кључна могућност за прецизно моделирање домена без стварања додатних типова омотача.

Главно

  • Associated Values — индивидуални подаци прикачени за case enum-а
  • Типови associated values могу да се разликују за сваки case
  • Извлачење се врши повезивањем вредности у switch или if case
  • Међусобно искључивање — associated values нису компатибилни са raw values
  • Пракса — моделирање грешака, резултата захтева и стања UI-ја

Шта су Associated Values?

Associated Values — то су додатне информације које case enum-а може да чува заједно са собом. За разлику од raw values, које су фиксиране на нивоу декларације, associated values се задају приликом креирања инстанце enum-а.

Замислите моделирање методе плаћања: case creditCard може да чува последње 4 цифре и датум истека, а case applePay — ништа. Са associated values ово се имплементира природно, без подкласа или опционих поља.

Према Apple документацији, associated values претварају enum из једноставног скупа константи у алгебарски тип података (sum type), карактеристичан за функционалне језике. Ово значајно повећава изражајност кода.

Синтакса associated values

Associated values се декларишу у заградама после case-а, са навођењем имена и типова параметара, као код функција.

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, а константе у case-евима — проверу поклапања са конкретним вредностима.

Associated Values vs Raw Values

Многи почетници програмери мешају associated values са raw values. То су различити механизми са различитим сценаријима примене.

КарактеристикаRaw ValuesAssociated Values
Тип податакаЈедан тип за све case-евеРазличити типови за сваки case
Тренутак задавањаПриликом декларације enum-аПриликом креирања инстанце
ОбавезностСви case-еви имају вредностНеки case-еви могу бити без вредности
КомпатибилностМеђусобно се искључују — не могу се користити истовремено

Према Swift Evolution, associated values су уведени у Swift 2.0 као део редизајна enum-а. Они обезбеђују алгебарски приступ типовима, где је сваки case посебан конструктор са сопственим потписом.

Практични примери 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 постаје моћно средство за коначне аутомате: сваки case — стање, associated values — параметри тог стања. Компајлер гарантује да су сви прелази обрађени.

Извлачење путем if case и guard case

За проверу једног 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 без параметара?

Да, case може немати associated values — на пример, case unknown. Такви case-еви се понашају као обични case-еви enum-а без додатних података. Ово је згодно за маркерна стања.

Како упоредити два enum-а са associated values?

Swift не генерише Equatable аутоматски за enum-ове са associated values (до Swift 4.2+). Додајте експлицитну имплементацију Equatable или користите switch за упоређивање сваког case-а понаособ.

Могу ли се користити associated values у рекурзивним enum-овима?

Да, associated values у indirect enum-у — стандардна техника за изградњу стабала и повезаних листи. Case може да садржи associated value истог типа са ознаком indirect.

По чему се associated values разликују од опционих својстава у struct-у?

Associated values су типски безбедни — сваки case гарантовано има само своје податке. У struct-у са опционалима, свака инстанца садржи сва поља и потребне су runtime провере на nil.

Да ли associated values подржавају Codable?

Swift не генерише Codable аутоматски за enum-ове са associated values. Потребна је ручна имплементација encode и decode путем switch-а по case-евима са коришћењем custom coding keys.

Резиме

  • Associated Values — механизам повезивања различитих података са сваким case-ом enum-а
  • Синтакса — декларација параметара у заградама после case-а, као код функција
  • Извлачење путем switch-а са let-повезивањем или if case
  • Не компатибилни са raw values — користите једно од тога
  • Генерици у associated values чине enum универзалним контејнером
  • State Machine — типичан сценарио за associated values у iOS-у

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође