Switch patterns can match tuple positions at the same time.

Match a pair of values

example
tuple_patterns.swift
Replay: real traced execution (multi-file project)
let x = 2
let y = 3
let point = (x, y)
var label = ""

switch point {
case (0, 0):
    label = "origin"
case (let column, 0):
    label = "x-axis \(column)"
case (0, let row):
    label = "y-axis \(row)"
case (let column, let row) where column == row:
    label = "diagonal \(column)"
default:
    label = "grid \(x),\(y)"
}

print("point=\(x),\(y)")
print(label)
let x = 0
let y = 3
let point = (x, y)
var label = ""

switch point {
case (0, 0):
    label = "origin"
case (let column, 0):
    label = "x-axis \(column)"
case (0, let row):
    label = "y-axis \(row)"
case (let column, let row) where column == row:
    label = "diagonal \(column)"
default:
    label = "grid \(x),\(y)"
}

print("point=\(x),\(y)")
print(label)
let x = 4
let y = 3
let point = (x, y)
var label = ""

switch point {
case (0, 0):
    label = "origin"
case (let column, 0):
    label = "x-axis \(column)"
case (0, let row):
    label = "y-axis \(row)"
case (let column, let row) where column == row:
    label = "diagonal \(column)"
default:
    label = "grid \(x),\(y)"
}

print("point=\(x),\(y)")
print(label)
let x = 2
let y = 0
let point = (x, y)
var label = ""

switch point {
case (0, 0):
    label = "origin"
case (let column, 0):
    label = "x-axis \(column)"
case (0, let row):
    label = "y-axis \(row)"
case (let column, let row) where column == row:
    label = "diagonal \(column)"
default:
    label = "grid \(x),\(y)"
}

print("point=\(x),\(y)")
print(label)
let x = 2
let y = 4
let point = (x, y)
var label = ""

switch point {
case (0, 0):
    label = "origin"
case (let column, 0):
    label = "x-axis \(column)"
case (0, let row):
    label = "y-axis \(row)"
case (let column, let row) where column == row:
    label = "diagonal \(column)"
default:
    label = "grid \(x),\(y)"
}

print("point=\(x),\(y)")
print(label)
  1. x ← 2, y ← 3, point ← (2, 3), label ← (empty)

    1let x→ 2 = 2  //@x=0, 42let y→ 3 = 3  //@y=0, 43let point→ (2, 3) = (x2, y3)4var label→ (empty) = ""
  2. switch point

    6switch point(2, 3) {7case (0, 0):8    label = "origin"
  3. label ← grid 2,3

    14    label = "diagonal \(column)"15default:16    label→ grid 2,3 = "grid \(x2),\(y3)"17}
  4. print("point=\(x),\(y)")

    19print("point=\(x2),\(y3)")20print(labelgrid 2,3)
    outputpoint=2,3
    grid 2,3
  1. x ← 0, y ← 3, point ← (0, 3), label ← (empty)

    1let x→ 0 = 02let y→ 3 = 33let point→ (0, 3) = (x0, y3)4var label→ (empty) = ""
  2. switch point

    6switch point(0, 3) {7case (0, 0):8    label = "origin"
  3. label ← y-axis 3

    10    label = "x-axis \(column)"11case (0, let row3):12    label→ y-axis 3 = "y-axis \(row3)"13case (let column, let row) where column == row:
  4. print("point=\(x),\(y)")

    19print("point=\(x0),\(y3)")20print(labely-axis 3)
    outputpoint=0,3
    y-axis 3
  1. x ← 4, y ← 3, point ← (4, 3), label ← (empty)

    1let x→ 4 = 42let y→ 3 = 33let point→ (4, 3) = (x4, y3)4var label→ (empty) = ""
  2. switch point

    6switch point(4, 3) {7case (0, 0):8    label = "origin"
  3. label ← grid 4,3

    14    label = "diagonal \(column)"15default:16    label→ grid 4,3 = "grid \(x4),\(y3)"17}
  4. print("point=\(x),\(y)")

    19print("point=\(x4),\(y3)")20print(labelgrid 4,3)
    outputpoint=4,3
    grid 4,3
  1. x ← 2, y ← 0, point ← (2, 0), label ← (empty)

    1let x→ 2 = 22let y→ 0 = 03let point→ (2, 0) = (x2, y0)4var label→ (empty) = ""
  2. switch point

    6switch point(2, 0) {7case (0, 0):8    label = "origin"
  3. label ← x-axis 2

    8    label = "origin"9case (let column2, 0):10    label→ x-axis 2 = "x-axis \(column2)"11case (0, let row):
  4. print("point=\(x),\(y)")

    19print("point=\(x2),\(y0)")20print(labelx-axis 2)
    outputpoint=2,0
    x-axis 2
  1. x ← 2, y ← 4, point ← (2, 4), label ← (empty)

    1let x→ 2 = 22let y→ 4 = 43let point→ (2, 4) = (x2, y4)4var label→ (empty) = ""
  2. switch point

    6switch point(2, 4) {7case (0, 0):8    label = "origin"
  3. label ← grid 2,4

    14    label = "diagonal \(column)"15default:16    label→ grid 2,4 = "grid \(x2),\(y4)"17}
  4. print("point=\(x),\(y)")

    19print("point=\(x2),\(y4)")20print(labelgrid 2,4)
    outputpoint=2,4
    grid 2,4
tuple pattern Tuple patterns let one switch inspect several related values together.