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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође