Enum i Swift — vad är det, syntax och användning

Författare: IT Sectr Publicerad: 2026-06-17 Lästid: 6 min

Enum i Swift är en typ som förenar en grupp relaterade värden under ett namn. Till skillnad från C och Objective-C, där enum bara är en samling heltalskonstanter, erbjuder Swift first-class uppräkningar med associated values, raw values, metoder och protokollstöd. Enligt Apple, 2026 är enum ett av de viktigaste verktygen för typsäker modellering av tillstånd i iOS-utveckling.

Huvudpunkter

  • Enum — typ för en grupp relaterade värden som ger typsäkerhet
  • Raw values — identiska värden av samma typ för alla case i uppräkningen
  • Associated values — olika datatyper, kopplade till varje case individuellt
  • Case deklareras med nyckelordet case och kan innehålla metoder
  • Switch med enum kräver uttömmande täckning av alla varianter av kompilatorn

Vad är enum i Swift?

Enum (uppräkning) — är en användardefinierad datatyp som kombinerar en ändlig uppsättning ömsesidigt uteslutande varianter. I Swift är enum inte bara numeriska konstanter, utan en fullvärdig typ med egen logik.

Varje variant av uppräkningen kallas case. Till skillnad från Objective-C, där enum reduceras till en heltalstyp, tillåter Swift varje case att lagra egna data och ha metoder.

Enligt Apple stöder enum i Swift generics, initierare, beräknade egenskaper och implementering av protokoll — detta gör det tillämpbart för modellering av tillstånd, fel, alternativ och ändliga tillståndsmaskiner.

Använd enum överallt där du behöver representera en ändlig mängd ömsesidigt uteslutande varianter: skärmtillstånd, feltyper, riktningar, filtreringsalternativ.

Syntax för enum-deklaration

Enum deklareras med nyckelordet enum följt av namn och kropp i klammerparenteser.

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

Case kan deklareras på en rad med komma:

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

För att nå ett case används punktnotation efter den kända typen:

swift
let direction = CompassDirection.north
// Typen är känd — förkortad syntax finns tillgänglig:
var currentPlanet = .earth

Efter tilldelning till en variabel av känd enum-typ, Swift härleder automatiskt typen och namnet på uppräkningen kan utelämnas när case nås.

Raw Values i uppräkningar

Raw Values — är värden av samma typ som tilldelas varje case i enum. Till skillnad från associated values är raw values identiska i typ för alla case och ställs in vid deklaration.

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

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

För heltals raw values ökar Swift automatiskt värdena om endast det första är explicit angivet:

swift
enum Status: Int {
    case pending = 1
    case active      // 2
    case completed   // 3
}

Raw values kan vara av typerna Int, String, Character eller vilken typ som helst som följer protokollet RawRepresentable. Swift genererar automatiskt initieraren init? för att skapa enum från raw value — detta är praktiskt vid tolkning av API-data.

Associated Values i enum

Associated Values gör det möjligt att koppla olika datatyper till varje case i uppräkningen individuellt. Till skillnad från raw values kan associated values skilja sig i typ och antal.

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

Vid bearbetning genom switch extraheras associated values genom bindning till variabler eller konstanter:

swift
let error = NetworkError.httpError(code: 403, message: "Forbidden")

switch error {
case .timeout(let seconds):
    print("Timeout efter \(seconds)s")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("Ingen anslutning")
case .unknown(let err):
    print("Okänd: \(err.localizedDescription)")
}

Enligt Apples dokumentation gör associated values enum till ett uttrycksfullt verktyg för att modellera komplexa tillstånd utan att skapa separata wrapper-typer. Använd dem för Result-liknande scenarier och modellering av fel med kontext.

Rekursiv enum (indirect)

Rekursiv enum — uppräkning vars case hänvisar till själva enum-typen. Sådana case markeras med nyckelordet indirect.

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

Nyckelordet indirect före enum markerar alla case som rekursiva. Alternativt kan endast ett specifikt case markeras med indirect:

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

Swift använder indirect för att lagra rekursiva case som referenser (reference semantics) istället för värden — detta undviker oändlig storlek på enum på stacken. Rekursiva enum används i stor utsträckning vid konstruktion av träd, länkade listor och AST.

Enum och protokoll

Enum kan implementera protokoll precis som strukturer och klasser. Detta är en viktig funktion i protokollorienterad programmering i 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 kan också implementera Cocoa-protokoll — till exempel CaseIterable för automatisk generering av samling av alla case eller Codable för serialisering. Detta gör enum till en universell byggsten i Swift-applikationer.

Vanliga frågor

Vad skiljer enum från struct i Swift?

Enum — är en typ med en ändlig uppsättning ömsesidigt uteslutande varianter, medan struct är en typ med en godtycklig uppsättning egenskaper. Enum kan inte ha stored properties, men stöder computed properties och metoder.

Kan enum ha både raw values och associated values samtidigt?

Nej, enum kan inte ha både raw values och associated values samtidigt. Raw values är värden av samma typ för alla case, associated values är individuella data för varje case. Dessa mekanismer utesluter varandra.

Hur får man en array av alla case i en enum?

Lägg till överensstämmelse med protokollet CaseIterable. Swift genererar automatiskt egenskapen allCases som returnerar en samling av alla case i deklarationsordning. Detta är praktiskt för iteration över alla varianter.

Är det obligatoriskt att använda switch för att bearbeta enum?

Switch — är den säkraste metoden eftersom kompilatorn kontrollerar uttömmande täckning. Man kan använda if case för att kontrollera ett case eller == för enum utan associated values.

Kan man skapa enum med generics?

Ja, enum stöder generics: enum Result<T, E> { case success(T); case failure(E) }. Detta gör det möjligt att skapa typsäkra generiska konstruktioner för hantering av framgång och fel.

Sammanfattning

  • Enum i Swift — fullvärdig typ med stöd för metoder, generics och protokoll
  • Raw values gör det möjligt att ställa in identiska värden av samma typ för alla case
  • Associated values ger möjlighet att koppla olika data till varje case
  • Indirect case är nödvändiga för rekursiva strukturer i enum
  • Protokoll kan implementeras av enum — detta är grunden för POP i Swift
  • Switch med enum garanterar uttömmande bearbetning på kompileringsnivå
  • Använd enum för modellering av ändliga tillstånd och typsäkra alternativ

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också