Functions such as map take a closure and apply it to each value in a collection.

Transform each value

multiplier
higher_order.swift
Replay: real traced execution (multi-file project)
let multiplier = 2
let numbers = [1, 2, 3]
let scaled = numbers.map { value in
    return value * multiplier
}
let total = scaled[0] + scaled[1] + scaled[2]

print("multiplier=\(multiplier)")
print("scaled=\(scaled)")
print("total=\(total)")
let multiplier = 3
let numbers = [1, 2, 3]
let scaled = numbers.map { value in
    return value * multiplier
}
let total = scaled[0] + scaled[1] + scaled[2]

print("multiplier=\(multiplier)")
print("scaled=\(scaled)")
print("total=\(total)")
let multiplier = 5
let numbers = [1, 2, 3]
let scaled = numbers.map { value in
    return value * multiplier
}
let total = scaled[0] + scaled[1] + scaled[2]

print("multiplier=\(multiplier)")
print("scaled=\(scaled)")
print("total=\(total)")
  1. multiplier ← 2, numbers ← [1, 2, 3], scaled ← [2, 4, 6], total ← 12

    1let multiplier→ 2 = 2  //@multiplier=3, 52let numbers→ [1, 2, 3] = [1, 2, 3]3let scaled→ [2, 4, 6] = numbers[1, 2, 3].map { value in4    return value * multiplier5}6let total→ 12 = scaled[0]2 + scaled[1]4 + scaled[2]678print("multiplier=\(multiplier2)")9print("scaled=\(scaled[2, 4, 6])")10print("total=\(total12)")
    outputmultiplier=2
    scaled=[2, 4, 6]
    total=12
  1. multiplier ← 3, numbers ← [1, 2, 3], scaled ← [3, 6, 9], total ← 18

    1let multiplier→ 3 = 32let numbers→ [1, 2, 3] = [1, 2, 3]3let scaled→ [3, 6, 9] = numbers[1, 2, 3].map { value in4    return value * multiplier5}6let total→ 18 = scaled[0]3 + scaled[1]6 + scaled[2]978print("multiplier=\(multiplier3)")9print("scaled=\(scaled[3, 6, 9])")10print("total=\(total18)")
    outputmultiplier=3
    scaled=[3, 6, 9]
    total=18
  1. multiplier ← 5, numbers ← [1, 2, 3], scaled ← [5, 10, 15], total ← 30

    1let multiplier→ 5 = 52let numbers→ [1, 2, 3] = [1, 2, 3]3let scaled→ [5, 10, 15] = numbers[1, 2, 3].map { value in4    return value * multiplier5}6let total→ 30 = scaled[0]5 + scaled[1]10 + scaled[2]1578print("multiplier=\(multiplier5)")9print("scaled=\(scaled[5, 10, 15])")10print("total=\(total30)")
    outputmultiplier=5
    scaled=[5, 10, 15]
    total=30

Follow the Map

  1. multiplier starts as 2.
  2. numbers starts as [1, 2, 3].
  3. map multiplies each number by 2.
  4. scaled becomes [2, 4, 6].
  5. Adding the scaled values gives total=12. | number | scaled with multiplier 2 | | --- | --- | | 1 | 2 | | 2 | 4 | | 3 | 6 | | total | 12 |
higher order `map` builds a new array by running a closure for each input element and collecting the returned values.

Exercise: higher_order.swift

Reproduce multiplier=2, scaled=[2, 4, 6], and total=12, then use the pinned multiplier variants 3 and 5 to predict scaled=[3, 6, 9] total=18 and scaled=[5, 10, 15] total=30.