📖 Scenario: Imagine you are building a simple app that counts how many times a button is pressed. You want to use a closure to keep track of the count. This project will help you understand how closures capture values from their surrounding context in Swift.
🎯 Goal: You will create a closure that remembers the number of times it has been called by capturing a variable from its surrounding context. This will help you understand how closures can keep state in Swift.
📋 What You'll Learn
Create a variable called count initialized to 0
Create a closure called increment that increases count by 1 each time it is called
Call the increment closure 3 times
Print the final value of count
💡 Why This Matters
🌍 Real World
Closures that capture values are used in apps to keep track of state, like counting button taps or managing animations.
💼 Career
Understanding how closures capture values is important for iOS developers to write clean, efficient, and bug-free code.
Progress0 / 4 steps
1
Create the count variable
Create a variable called count and set it to 0.
Swift
Hint
Use var count = 0 to create a variable that can change.
2
Create the increment closure
Create a closure called increment that adds 1 to the variable count each time it is called.
Swift
Hint
Define increment as a closure with let increment = { ... } and inside add count += 1.
3
Call the increment closure 3 times
Call the closure increment exactly three times to increase count.
Swift
Hint
Call increment() three times, each on its own line.
4
Print the final value of count
Write a print statement to display the final value of count.
Swift
Hint
Use print(count) to show the number 3.
Practice
(1/5)
1. What does it mean when a Swift closure captures values from context?
easy
A. The closure only works with global variables
B. The closure creates new variables unrelated to the surrounding scope
C. The closure cannot access any variables outside its own body
D. The closure keeps a reference to variables from its surrounding scope
Solution
Step 1: Understand closure context
A closure can access variables defined outside its own body, in the surrounding scope.
Step 2: Capturing means referencing
Capturing means the closure keeps a reference to those external variables so it can use them later.
Final Answer:
The closure keeps a reference to variables from its surrounding scope -> Option D
Quick Check:
Closure captures = keeps reference [OK]
Hint: Closures remember variables around them by reference [OK]
Common Mistakes:
Thinking closures create new independent variables
2. Which of the following is the correct syntax to capture a value by copy in a Swift closure?
easy
A. let closure = { [value] in print(value) }
B. let closure = { [value = value] in print(value) }
C. let closure = { value in print(value) }
D. let closure = { capture value in print(value) }
Solution
Step 1: Recognize capture list syntax
To capture by value, Swift uses a capture list with syntax like [var = value].
Step 2: Match correct syntax
let closure = { [value = value] in print(value) } uses [value = value] which copies the current value into the closure.
Final Answer:
let closure = { [value = value] in print(value) } -> Option B
Quick Check:
Capture by copy uses [var = var] syntax [OK]
Hint: Use capture list with assignment to copy value [OK]
Common Mistakes:
Omitting capture list brackets
Using capture list without assignment
Writing invalid keywords like 'capture'
3. What will be printed by this Swift code?
var x = 10
let closure = { print(x) }
x = 20
closure()
medium
A. 20
B. nil
C. Compilation error
D. 10
Solution
Step 1: Understand reference capture
The closure captures x by reference, so it uses the current value when called.
Step 2: Check value at call time
Since x was changed to 20 before calling the closure, it prints 20.
Final Answer:
20 -> Option A
Quick Check:
Reference capture prints updated value [OK]
Hint: Closures print current variable value unless captured by copy [OK]
Common Mistakes:
Assuming closure prints original value 10
Expecting compilation error due to variable change
Thinking closure prints nil
4. Identify the error in this Swift closure code:
var count = 0
let increment = { count += 1 }
increment()
print(count)
medium
A. No error; code runs and prints 1
B. Closure must declare 'count' as inout parameter
C. Cannot modify 'count' inside closure without 'self.'
D. Closure cannot capture variables declared outside
Solution
Step 1: Check variable mutability
count is a variable (var), so it can be modified inside the closure.
Step 2: Verify closure behavior
The closure increments count by 1, then printing count outputs 1.
Final Answer:
No error; code runs and prints 1 -> Option A
Quick Check:
Mutable var can be changed inside closure [OK]
Hint: Vars can be changed inside closures without extra syntax [OK]
Common Mistakes:
Thinking 'self.' is required outside classes
Believing inout needed for closure variables
Assuming closures cannot modify external vars
5. You want a Swift closure to capture the value of a variable at the moment the closure is created, so later changes to the variable don't affect the closure. How do you do this?
hard
A. Declare the variable as a constant (let) before the closure
B. Use a global variable instead of a local one
C. Use a capture list to copy the variable value inside the closure
D. Modify the variable inside the closure before using it
Solution
Step 1: Understand default capture behavior
By default, closures capture variables by reference, so changes affect the closure.
Step 2: Use capture list to copy value
Using a capture list like [value = variable] copies the current value into the closure, isolating it from later changes.
Final Answer:
Use a capture list to copy the variable value inside the closure -> Option C
Quick Check:
Capture list copies value to freeze it [OK]
Hint: Capture list copies value to freeze it at closure creation [OK]
Common Mistakes:
Thinking 'let' alone freezes variable for closure
Using global variables to avoid capture issues
Modifying variable inside closure doesn't freeze value
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.