Enums and Pattern Matching
Associated Values
Enum cases can carry data that belongs to that case.
Store data with a case
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)
useMetric ← true
6let useMetric→ true = true //@useMetric=false7let measurement: Measurementif useMetric
9if useMetrictrue {10 measurement = Measurement.centimeters(30)11} else {label ← (empty)
15var label→ (empty) = ""16switch measurement {switch measurement
15var label = ""16switch measurementcentimeters(30) {17case Measurement.centimeters(let value):18 label = "cm=\(value)"label ← cm=30
16switch measurement {17case Measurement.centimeters(let value30):18 label→ cm=30 = "cm=\(value30)"19case Measurement.inches(let value):print("useMetric=\(useMetric)")
23print("useMetric=\(useMetrictrue)")24print(labelcm=30)outputuseMetric=true cm=30
useMetric ← false
6let useMetric→ false = false7let measurement: Measurementlabel ← (empty)
15var label→ (empty) = ""16switch measurement {switch measurement
15var label = ""16switch measurementinches(12) {17case Measurement.centimeters(let value):18 label = "cm=\(value)"label ← in=12
18 label = "cm=\(value)"19case Measurement.inches(let value12):20 label→ in=12 = "in=\(value12)"21}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.