Functions and Closures
Higher Order Functions
Functions such as map take a closure and apply it to each value in a
collection.
Transform each value
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)")
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
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
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
multiplierstarts as2.numbersstarts as[1, 2, 3].mapmultiplies each number by2.scaledbecomes[2, 4, 6].- 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.