Switch statements can handle each enum case explicitly.

Match every state

step
switch_enum.swift
Replay: real traced execution (multi-file project)
enum TaskStatus {
    case queued
    case running
    case done
}

let step = 2
let status: TaskStatus

if step == 0 {
    status = TaskStatus.queued
} else if step < 3 {
    status = TaskStatus.running
} else {
    status = TaskStatus.done
}

var message = ""
switch status {
case TaskStatus.queued:
    message = "waiting"
case TaskStatus.running:
    message = "working"
case TaskStatus.done:
    message = "complete"
}

print("step=\(step)")
print(message)
enum TaskStatus {
    case queued
    case running
    case done
}

let step = 0
let status: TaskStatus

if step == 0 {
    status = TaskStatus.queued
} else if step < 3 {
    status = TaskStatus.running
} else {
    status = TaskStatus.done
}

var message = ""
switch status {
case TaskStatus.queued:
    message = "waiting"
case TaskStatus.running:
    message = "working"
case TaskStatus.done:
    message = "complete"
}

print("step=\(step)")
print(message)
enum TaskStatus {
    case queued
    case running
    case done
}

let step = 4
let status: TaskStatus

if step == 0 {
    status = TaskStatus.queued
} else if step < 3 {
    status = TaskStatus.running
} else {
    status = TaskStatus.done
}

var message = ""
switch status {
case TaskStatus.queued:
    message = "waiting"
case TaskStatus.running:
    message = "working"
case TaskStatus.done:
    message = "complete"
}

print("step=\(step)")
print(message)
  1. step ← 2

    7let step→ 2 = 2  //@step=0, 48let status: TaskStatus
  2. if step < 3

    11    status = TaskStatus.queued12} else if step2 < 3 {13    status = TaskStatus.running14} else {
  3. message ← (empty)

    18var message→ (empty) = ""19switch status {
  4. switch status

    18var message = ""19switch statusrunning {20case TaskStatus.queued:21    message = "waiting"
  5. message ← working

    21    message = "waiting"22case TaskStatus.running:23    message→ working = "working"24case TaskStatus.done:
  6. print("step=\(step)")

    28print("step=\(step2)")29print(messageworking)
    outputstep=2
    working
  1. step ← 0

    7let step→ 0 = 08let status: TaskStatus
  2. if step == 0

    10if step0 == 0 {11    status = TaskStatus.queued12} else if step < 3 {
  3. message ← (empty)

    18var message→ (empty) = ""19switch status {
  4. switch status

    18var message = ""19switch statusqueued {20case TaskStatus.queued:21    message = "waiting"
  5. message ← waiting

    19switch status {20case TaskStatus.queued:21    message→ waiting = "waiting"22case TaskStatus.running:
  6. print("step=\(step)")

    28print("step=\(step0)")29print(messagewaiting)
    outputstep=0
    waiting
  1. step ← 4

    7let step→ 4 = 48let status: TaskStatus
  2. message ← (empty)

    18var message→ (empty) = ""19switch status {
  3. switch status

    18var message = ""19switch statusdone {20case TaskStatus.queued:21    message = "waiting"
  4. message ← complete

    23    message = "working"24case TaskStatus.done:25    message→ complete = "complete"26}
  5. print("step=\(step)")

    28print("step=\(step4)")29print(messagecomplete)
    outputstep=4
    complete
exhaustive switch Swift checks enum switches so every possible case is handled.