SWIFT

Swift Enum: Syntax, Usage, and Examples

Enums in Swift define a group of related values under a single type. They help you write safer, more readable code by eliminating magic numbers and strings. Unlike enums in some other languages, Swift enums can store associated values and methods, making them highly flexible. They also support raw values and can conform to protocols, which enhances their usability across different programming scenarios.

How to Use Enums in Swift

Enums use the enum keyword followed by a list of cases. Each case represents a possible value.

enum Direction {
    case north
    case south
    case east
    case west
}

Assigning Enum Values

You can assign an enum value to a variable or constant using dot notation.

let currentDirection: Direction = .west

If the type is already known, you can omit the enum name for brevity.

var nextMove = Direction.east

Switching on Enum Cases

Using a switch statement with enums makes handling different cases easy and eliminates the need for lengthy if statements.

switch currentDirection {
case .north:
    print("Heading north")
case .south:
    print("Heading south")
case .east:
    print("Heading east")
case .west:
    print("Heading west")
}

Since Swift requires switch statements to be exhaustive, you must cover all cases or use a default case.

When to Use Enums in Swift

Enums help eliminate hardcoded values and make your code more maintainable. They are useful in several scenarios, including defining states, handling API responses, and managing configurations.

Grouping Related Values

Enums allow you to replace strings or integers when defining a set of possible values. Instead of using "monday", "tuesday", and so on, you can use an enum for better safety.

enum Day {
    case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}

Handling API Responses

Enums make handling API responses structured by replacing status codes or response strings with well-defined cases.

enum StatusCode {
    case success
    case error
    case loading
}

This approach reduces the risk of typos and makes response handling more predictable.

Defining State Machines

Enums work well for managing state in an application. For example, you can use an enum to track a user’s authentication state.

enum AuthState {
    case loggedIn, loggedOut, inProgress
}

Examples of Enums in Swift

Using Enums with Raw Values

You can assign raw values to enums, which is useful when storing integer or string representations of a case.

enum HTTPStatus: Int {
    case ok = 200
    case notFound = 404
    case serverError = 500
}

let responseCode = HTTPStatus.ok.rawValue
print(responseCode) // Output: 200

Enums with Associated Values

Enums can store associated values, allowing you to attach additional data to each case.

enum Payment {
    case cash(amount: Double)
    case card(number: String, expiry: String)
}

let transaction = Payment.card(number: "1234-5678-9012-3456", expiry: "12/24")

switch transaction {
case .cash(let amount):
    print("Paid in cash: \(amount)")
case .card(let number, let expiry):
    print("Paid with card ending in \(number.suffix(4)), expires \(expiry)")
}

This feature allows you to store different data types within a single enum.

Enum Methods

You can define methods inside an enum to add behavior directly to its cases.

enum TrafficLight {
    case red, yellow, green

    func description() -> String {
        switch self {
        case .red:
            return "Stop"
        case .yellow:
            return "Slow down"
        case .green:
            return "Go"
        }
    }
}

let light = TrafficLight.red
print(light.description()) // Output: Stop

Adding methods to enums helps keep related logic together, improving code organization.

Comparing Enums

You can compare enum values using the equality operator.

if light == .red {
    print("You must stop.")
}

This ensures type safety since only valid cases can be compared.

Learn More About Enums in Swift

Swift enums offer additional features like default values, protocol conformance, and computed properties.

Enum with Default Values

If an enum has raw values, you can initialize an instance using init(rawValue:). This allows you to convert external data into an enum safely.

enum SeatClass: String {
    case economy = "Economy"
    case business = "Business"
    case first = "First Class"
}

let chosenSeat = SeatClass(rawValue: "Business")

If the provided raw value doesn’t match any case, the initializer returns nil, which makes it useful for handling unknown data.

Enum with Protocols

Enums can conform to protocols, enabling shared behavior across different types.

protocol Printable {
    func printValue()
}

enum Vehicle: Printable {
    case car, bike, bus

    func printValue() {
        print(self)
    }
}

let myVehicle = Vehicle.car
myVehicle.printValue() // Output: car

This technique allows enums to work seamlessly with other types in your code.

Using Enums as Function Parameters

Passing enums as function parameters ensures type safety and improves code clarity.

func setTheme(_ theme: Theme) {
    switch theme {
    case .dark:
        print("Dark mode activated")
    case .light:
        print("Light mode activated")
    }
}

enum Theme {
    case dark, light
}

setTheme(.dark)

This method prevents invalid values from being passed to functions, reducing bugs.

Enums Inside Classes

Enums can be nested within classes or structs, making them more modular.

class Car {
    enum Transmission {
        case manual, automatic
    }

    let transmission: Transmission

    init(transmission: Transmission) {
        self.transmission = transmission
    }
}

let myCar = Car(transmission: .automatic)

By nesting enums, you can keep related data encapsulated within its relevant context.

Best Practices for Using Enums

  • Use camelCase for enum cases (case active instead of case ACTIVE).
  • Prefer switch statements over ifelse for handling enum values.
  • Store associated values instead of separate variables when relevant.
  • Use raw values only when necessary (e.g., mapping to API values).
  • Consider protocol conformance if you need shared behavior across enums.
Learn to Code in Swift for Free
Start learning now
button icon
To advance beyond this tutorial and learn Swift by doing, try the interactive experience of Mimo. Whether you're starting from scratch or brushing up your coding skills, Mimo helps you take your coding journey above and beyond.

Sign up or download Mimo from the App Store or Google Play to enhance your programming skills and prepare for a career in tech.

You can code, too.

© 2025 Mimo GmbH