Constraints let generic code require capabilities such as comparison.

Require comparable values

leftScore
type_constraints.swift
Replay: real traced execution (multi-file project)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
    return left >= right ? left : right
}

let leftScore = 14
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"

print(summary)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
    return left >= right ? left : right
}

let leftScore = 3
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"

print(summary)
func larger<T: Comparable>(_ left: T, _ right: T) -> T {
    return left >= right ? left : right
}

let leftScore = 21
let rightScore = 18
let winner = larger(leftScore, rightScore)
let summary = "winner=\(winner)"

print(summary)
  1. leftScore ← 14, rightScore ← 18

    5let leftScore→ 14 = 14  //@leftScore=3, 216let rightScore→ 18 = 187let winner = larger(leftScore14, rightScore18)8let summary = "winner=\(winner)"
  2. func larger<T: Comparable>(_ left: T, _ right: T) -> T

    1func larger<T: Comparable>(_ left14: T, _ right18: T) -> T {2    return left14 >= right18 ? left : right3}
  3. winner ← 18, summary ← winner=18

    6let rightScore = 187let winner→ 18 = larger(leftScore14, rightScore18)8let summary→ winner=18 = "winner=\(winner18)"910print(summarywinner=18)
    outputwinner=18
  1. leftScore ← 3, rightScore ← 18

    5let leftScore→ 3 = 36let rightScore→ 18 = 187let winner = larger(leftScore3, rightScore18)8let summary = "winner=\(winner)"
  2. func larger<T: Comparable>(_ left: T, _ right: T) -> T

    1func larger<T: Comparable>(_ left3: T, _ right18: T) -> T {2    return left3 >= right18 ? left : right3}
  3. winner ← 18, summary ← winner=18

    6let rightScore = 187let winner→ 18 = larger(leftScore3, rightScore18)8let summary→ winner=18 = "winner=\(winner18)"910print(summarywinner=18)
    outputwinner=18
  1. leftScore ← 21, rightScore ← 18

    5let leftScore→ 21 = 216let rightScore→ 18 = 187let winner = larger(leftScore21, rightScore18)8let summary = "winner=\(winner)"
  2. func larger<T: Comparable>(_ left: T, _ right: T) -> T

    1func larger<T: Comparable>(_ left21: T, _ right18: T) -> T {2    return left21 >= right18 ? left : right3}
  3. winner ← 21, summary ← winner=21

    6let rightScore = 187let winner→ 21 = larger(leftScore21, rightScore18)8let summary→ winner=21 = "winner=\(winner21)"910print(summarywinner=21)
    outputwinner=21
type constraint A constrained type parameter can use operations promised by the protocol constraint.