Associated Values — механизам Swift-а који омогућава прикачивање произвољних података свакој варијанти enum-а појединачно. За разлику од raw values, где сви case-еви имају вредности истог типа, associated values могу да се разликују по типу и броју за сваки case. Према Apple Documentation, 2026, ово је кључна могућност за прецизно моделирање домена без стварања додатних типова омотача.
Главно
Associated Values — то су додатне информације које case enum-а може да чува заједно са собом. За разлику од raw values, које су фиксиране на нивоу декларације, associated values се задају приликом креирања инстанце enum-а.
Замислите моделирање методе плаћања: case creditCard може да чува последње 4 цифре и датум истека, а case applePay — ништа. Са associated values ово се имплементира природно, без подкласа или опционих поља.
Према Apple документацији, associated values претварају enum из једноставног скупа константи у алгебарски тип података (sum type), карактеристичан за функционалне језике. Ово значајно повећава изражајност кода.
Associated values се декларишу у заградама после case-а, са навођењем имена и типова параметара, као код функција.
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, а константе у case-евима — проверу поклапања са конкретним вредностима.
Многи почетници програмери мешају associated values са raw values. То су различити механизми са различитим сценаријима примене.
| Карактеристика | Raw Values | Associated Values |
|---|---|---|
| Тип података | Један тип за све case-еве | Различити типови за сваки case |
| Тренутак задавања | Приликом декларације enum-а | Приликом креирања инстанце |
| Обавезност | Сви case-еви имају вредност | Неки case-еви могу бити без вредности |
| Компатибилност | Међусобно се искључују — не могу се користити истовремено | |
Према Swift Evolution, associated values су уведени у Swift 2.0 као део редизајна enum-а. Они обезбеђују алгебарски приступ типовима, где је сваки case посебан конструктор са сопственим потписом.
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 постаје моћно средство за коначне аутомате: сваки case — стање, associated values — параметри тог стања. Компајлер гарантује да су сви прелази обрађени.
За проверу једног case-а без 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)")
Често постављана питања
Да, case може немати associated values — на пример, case unknown. Такви case-еви се понашају као обични case-еви enum-а без додатних података. Ово је згодно за маркерна стања.
Swift не генерише Equatable аутоматски за enum-ове са associated values (до Swift 4.2+). Додајте експлицитну имплементацију Equatable или користите switch за упоређивање сваког case-а понаособ.
Да, associated values у indirect enum-у — стандардна техника за изградњу стабала и повезаних листи. Case може да садржи associated value истог типа са ознаком indirect.
Associated values су типски безбедни — сваки case гарантовано има само своје податке. У struct-у са опционалима, свака инстанца садржи сва поља и потребне су runtime провере на nil.
Swift не генерише Codable аутоматски за enum-ове са associated values. Потребна је ручна имплементација encode и decode путем switch-а по case-евима са коришћењем custom coding keys.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође