Generic functions can work with more than one concrete type while keeping type information.

Reuse one function shape

firstNumber
generic_functions.swift
Replay: real traced execution (multi-file project)
func describePair<T>(_ first: T, _ second: T) -> String {
    return "\(first)|\(second)"
}

let firstNumber = 3
let secondNumber = firstNumber + 2
let label = describePair(firstNumber, secondNumber)

print(label)
func describePair<T>(_ first: T, _ second: T) -> String {
    return "\(first)|\(second)"
}

let firstNumber = 8
let secondNumber = firstNumber + 2
let label = describePair(firstNumber, secondNumber)

print(label)
func describePair<T>(_ first: T, _ second: T) -> String {
    return "\(first)|\(second)"
}

let firstNumber = 13
let secondNumber = firstNumber + 2
let label = describePair(firstNumber, secondNumber)

print(label)
  1. firstNumber ← 3, secondNumber ← 5

    5let firstNumber→ 3 = 3  //@firstNumber=8, 136let secondNumber→ 5 = firstNumber3 + 27let label = describePair(firstNumber3, secondNumber5)
  2. func describePair<T>(_ first: T, _ second: T) -> String

    1func describePair<T>(_ first3: T, _ second5: T) -> String {2    return "\(first3)|\(second5)"3}
  3. label ← 3|5

    6let secondNumber = firstNumber + 27let label→ 3|5 = describePair(firstNumber3, secondNumber5)89print(label3|5)
    output3|5
  1. firstNumber ← 8, secondNumber ← 10

    5let firstNumber→ 8 = 86let secondNumber→ 10 = firstNumber8 + 27let label = describePair(firstNumber8, secondNumber10)
  2. func describePair<T>(_ first: T, _ second: T) -> String

    1func describePair<T>(_ first8: T, _ second10: T) -> String {2    return "\(first8)|\(second10)"3}
  3. label ← 8|10

    6let secondNumber = firstNumber + 27let label→ 8|10 = describePair(firstNumber8, secondNumber10)89print(label8|10)
    output8|10
  1. firstNumber ← 13, secondNumber ← 15

    5let firstNumber→ 13 = 136let secondNumber→ 15 = firstNumber13 + 27let label = describePair(firstNumber13, secondNumber15)
  2. func describePair<T>(_ first: T, _ second: T) -> String

    1func describePair<T>(_ first13: T, _ second15: T) -> String {2    return "\(first13)|\(second15)"3}
  3. label ← 13|15

    6let secondNumber = firstNumber + 27let label→ 13|15 = describePair(firstNumber13, secondNumber15)89print(label13|15)
    output13|15
generic function A type parameter lets one function describe the same operation for different input types.