Functions and Closures
Closure Values
Closures store small blocks of code in values that can be called later.
Store a callable block
closure_values.swift
Replay: real traced execution (multi-file project)
let increment = 2
let addIncrement = { (value: Int) -> Int in
return value + increment
}
let base = 10
let result = addIncrement(base)
print("increment=\(increment)")
print("result=\(result)")
let increment = 1
let addIncrement = { (value: Int) -> Int in
return value + increment
}
let base = 10
let result = addIncrement(base)
print("increment=\(increment)")
print("result=\(result)")
let increment = 4
let addIncrement = { (value: Int) -> Int in
return value + increment
}
let base = 10
let result = addIncrement(base)
print("increment=\(increment)")
print("result=\(result)")
increment ← 2, addIncrement ← (Function), base ← 10, result ← 12
1let increment→ 2 = 2 //@increment=1, 42let addIncrement→ (Function) = { (value: Int) -> Int in3 return value10 + increment24}56let base→ 10 = 107let result→ 12 = addIncrement(base10)89print("increment=\(increment2)")10print("result=\(result12)")outputincrement=2 result=12
increment ← 1, addIncrement ← (Function), base ← 10, result ← 11
1let increment→ 1 = 12let addIncrement→ (Function) = { (value: Int) -> Int in3 return value10 + increment14}56let base→ 10 = 107let result→ 11 = addIncrement(base10)89print("increment=\(increment1)")10print("result=\(result11)")outputincrement=1 result=11
increment ← 4, addIncrement ← (Function), base ← 10, result ← 14
1let increment→ 4 = 42let addIncrement→ (Function) = { (value: Int) -> Int in3 return value10 + increment44}56let base→ 10 = 107let result→ 14 = addIncrement(base10)89print("increment=\(increment4)")10print("result=\(result14)")outputincrement=4 result=14
Follow the Closure
incrementstarts as2.basestarts as10.- The closure adds the captured increment to the base value.
resultbecomes12.- The program prints
increment=2andresult=12. | increment | base | result | | --- | --- | --- | | 2 | 10 | 12 | | 1 | 10 | 11 | | 4 | 10 | 14 |
closures
A closure can capture a value from the surrounding scope. Calling the closure uses both its parameter and the captured value.
Exercise: closure_values.swift
Reproduce increment=2 and result=12, then use the pinned increment variants 1 and 4 to predict results 11 and 14.