Enum у Swift-у — шта је то, синтакса и употреба

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

Enum у Swift-у је тип који обједињује групу повезаних вредности под једним именом. За разлику од C и Objective-C, где је enum само скуп целобројних константи, Swift нуди first-class набрајања са associated values, raw values, методама и подршком за протоколе. Према Apple, 2026, enum је један од кључних алата за тип-безбедно моделовање стања у iOS развоју.

Главно

  • Enum — тип за групу повезаних вредности, обезбеђује тип-безбедност
  • Raw values — исте вредности истог типа за све кејсеве набрајања
  • Associated values — различити типови података, везани за сваки кејс појединачно
  • Кејсеви се декларишу кључном речи case и могу садржати методе
  • Switch са enum захтева исцрпну обраду свих варијанти од стране компајлера

Шта је enum у Swift-у?

Enum (набрајање) — је кориснички дефинисан тип података који обједињује коначан скуп међусобно искључивих варијанти. У Swift-у, enum није само нумеричке константе, већ пуноправни тип са сопственом логиком.

Свака варијанта набрајања назива се кејс. За разлику од Objective-C, где се enum своди на целобројни тип, Swift омогућава сваком кејсу да чува сопствене податке и има методе.

Према подацима Apple-а, enum у Swift-у подржава генерике, инициализаторе, израчунава својства и имплементацију протокола — то га чини применљивим за моделовање стања, грешака, опција и коначних аутомата.

Користите enum свуда где је потребно представити коначан скуп међусобно искључивих варијанти: стања екрана, типове грешака, правце, опције филтрирања.

Синтакса декларације enum

Enum се декларише кључном речи enum са називом и телом у витичастим заградама.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

Кејсеви се могу декларисати у једном реду са зарезом:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

За приступ кејсу користи се тачкаста синтакса након познатог типа:

swift
let direction = CompassDirection.north
// Тип је познат — скраћена синтакса је доступна:
var currentPlanet = .earth

Након доделе променљивој познатог enum типа, Swift аутоматски закључује тип и може се изоставити име набрајања при приступу кејсевима.

Raw Values у набрајањима

Raw Values — су вредности истог типа које се додељују сваком кејсу enum-а. За разлику од associated values, raw values су исте по типу за све кејсеве и постављају се при декларацији.

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

За целобројне raw values Swift аутоматски инкрементира вредности ако је само први експлицитно наведен:

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 у enum

Associated Values омогућавају причвршћивање различитих типова података за сваки кејс набрајања појединачно. За разлику од raw values, associated values могу се разликовати по типу и количини.

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

При обради путем switch-а, associated values се извлаче кроз везивање за променљиве или константе:

swift
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 (indirect)

Рекурзивни enum — набрајање чији кејсеви упућују на сам тип enum. Такви кејсеви се обележавају кључном речи indirect.

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

Кључна реч indirect испред enum обележава све кејсеве као рекурзивне. Алтернативно, може се обележити indirect само одређени кејс:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Swift користи indirect за чување рекурзивних кејсева као референци (reference semantics) уместо вредности — то избегава бесконачну величину enum на стек-у. Рекурзивни enum-и се широко користе при изградњи стабала, повезаних листи и AST-а.

Enum и протоколи

Enum може имплементирати протоколе исто као структуре и класе. Ово је кључна могућност протокол-оријентисаног програмирања у Swift-у.

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 у Swift-у?

Enum — је тип са коначним скупом међусобно искључивих варијанти, а struct — тип са произвољним скупом својстава. Enum не може имати stored properties, али подржава computed properties и методе.

Може ли enum имати и raw values и associated values истовремено?

Не, enum не може истовремено имати raw values и associated values. Raw values — вредности истог типа за све кејсеве, associated values — индивидуални подаци за сваки кејс. Ови механизми се међусобно искључују.

Како добити низ свих кејсева enum-а?

Додајте усклађеност са протоколом CaseIterable. Swift аутоматски генерише својство allCases које враћа колекцију свих кејсева редом декларације. Ово је згодно за итерацију кроз све варијанте.

Да ли је обавезно користити switch за обраду enum-а?

Switch — најсигурнији начин, јер компајлер проверава исцрпну обраду. Може се користити if case за проверу једног кејса или == за enum без associated values.

Може ли се креирати enum са генерицима?

Да, enum подржава генерике: enum Result<T, E> { case success(T); case failure(E) }. Ово омогућава креирање тип-безбедних генеричких конструкција за обраду успеха и грешке.

Закључци

  • Enum у Swift-у — пуноправни тип са подршком за методе, генерике и протоколе
  • Raw values омогућавају постављање истих вредности истог типа за све кејсеве
  • Associated values дају могућност причвршћивања различитих података за сваки кејс
  • Indirect кејсеви су неопходни за рекурзивне структуре у enum-у
  • Протоколи се могу имплементирати од стране enum-а — то је основа POP-а у Swift-у
  • Switch са enum гарантује исцрпну обраду на нивоу компајлације
  • Користите enum за моделовање коначних стања и тип-безбедних опција

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

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

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

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