Closures store small blocks of code in values that can be called later.

Store a callable block

increment
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)")
  1. 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
  1. 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
  1. 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

  1. increment starts as 2.
  2. base starts as 10.
  3. The closure adds the captured increment to the base value.
  4. result becomes 12.
  5. The program prints increment=2 and result=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.