Enums and Pattern Matching
Switch on an Enum
Switch statements can handle each enum case explicitly.
Match every state
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)
step ← 2
7let step→ 2 = 2 //@step=0, 48let status: TaskStatusif step < 3
11 status = TaskStatus.queued12} else if step2 < 3 {13 status = TaskStatus.running14} else {message ← (empty)
18var message→ (empty) = ""19switch status {switch status
18var message = ""19switch statusrunning {20case TaskStatus.queued:21 message = "waiting"message ← working
21 message = "waiting"22case TaskStatus.running:23 message→ working = "working"24case TaskStatus.done:print("step=\(step)")
28print("step=\(step2)")29print(messageworking)outputstep=2 working
step ← 0
7let step→ 0 = 08let status: TaskStatusif step == 0
10if step0 == 0 {11 status = TaskStatus.queued12} else if step < 3 {message ← (empty)
18var message→ (empty) = ""19switch status {switch status
18var message = ""19switch statusqueued {20case TaskStatus.queued:21 message = "waiting"message ← waiting
19switch status {20case TaskStatus.queued:21 message→ waiting = "waiting"22case TaskStatus.running:print("step=\(step)")
28print("step=\(step0)")29print(messagewaiting)outputstep=0 waiting
step ← 4
7let step→ 4 = 48let status: TaskStatusmessage ← (empty)
18var message→ (empty) = ""19switch status {switch status
18var message = ""19switch statusdone {20case TaskStatus.queued:21 message = "waiting"message ← complete
23 message = "working"24case TaskStatus.done:25 message→ complete = "complete"26}print("step=\(step)")
28print("step=\(step4)")29print(messagecomplete)outputstep=4 complete
exhaustive switch
Swift checks enum switches so every possible case is handled.