Enum cases can carry data that belongs to that case.

Store data with a case

useMetric
associated_values.swift
Replay: real traced execution (multi-file project)
enum Measurement {
    case centimeters(Int)
    case inches(Int)
}

let useMetric = true
let measurement: Measurement

if useMetric {
    measurement = Measurement.centimeters(30)
} else {
    measurement = Measurement.inches(12)
}

var label = ""
switch measurement {
case Measurement.centimeters(let value):
    label = "cm=\(value)"
case Measurement.inches(let value):
    label = "in=\(value)"
}

print("useMetric=\(useMetric)")
print(label)
enum Measurement {
    case centimeters(Int)
    case inches(Int)
}

let useMetric = false
let measurement: Measurement

if useMetric {
    measurement = Measurement.centimeters(30)
} else {
    measurement = Measurement.inches(12)
}

var label = ""
switch measurement {
case Measurement.centimeters(let value):
    label = "cm=\(value)"
case Measurement.inches(let value):
    label = "in=\(value)"
}

print("useMetric=\(useMetric)")
print(label)
  1. useMetric ← true

    6let useMetric→ true = true  //@useMetric=false7let measurement: Measurement
  2. if useMetric

    9if useMetrictrue {10    measurement = Measurement.centimeters(30)11} else {
  3. label ← (empty)

    15var label→ (empty) = ""16switch measurement {
  4. switch measurement

    15var label = ""16switch measurementcentimeters(30) {17case Measurement.centimeters(let value):18    label = "cm=\(value)"
  5. label ← cm=30

    16switch measurement {17case Measurement.centimeters(let value30):18    label→ cm=30 = "cm=\(value30)"19case Measurement.inches(let value):
  6. print("useMetric=\(useMetric)")

    23print("useMetric=\(useMetrictrue)")24print(labelcm=30)
    outputuseMetric=true
    cm=30
  1. useMetric ← false

    6let useMetric→ false = false7let measurement: Measurement
  2. label ← (empty)

    15var label→ (empty) = ""16switch measurement {
  3. switch measurement

    15var label = ""16switch measurementinches(12) {17case Measurement.centimeters(let value):18    label = "cm=\(value)"
  4. label ← in=12

    18    label = "cm=\(value)"19case Measurement.inches(let value12):20    label→ in=12 = "in=\(value12)"21}
  5. print("useMetric=\(useMetric)")

    23print("useMetric=\(useMetricfalse)")24print(labelin=12)
    outputuseMetric=false
    in=12
associated values Associated values keep related data inside the enum value so each case can carry the information it needs.