Challenge - 5 Problems
Swift Closure Capture Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
Output of closure capturing a variable
What is the output of this Swift code snippet?
Swift
var x = 10 let closure = { [x] in print(x) } x = 20 closure()
Attempts:
2 left
💡 Hint
Think about when the value of x is captured by the closure.
✗ Incorrect
The closure captures the value of x at the time of its creation because of the capture list [x]. Later changes to x do not affect the captured value.
❓ Predict Output
intermediate2:00remaining
Effect of capture list on reference type
What will this Swift code print?
Swift
class Counter { var count = 0 } let counter = Counter() let closure = { [counter] in print(counter.count) } counter.count = 5 closure()
Attempts:
2 left
💡 Hint
Consider how reference types behave when captured in closures.
✗ Incorrect
The capture list captures the reference to the Counter instance, not a copy. So changes to counter.count are visible inside the closure.
🔧 Debug
advanced3:00remaining
Why does this closure cause a retain cycle?
Examine the code below. Why does it cause a retain cycle?
Swift
class Person { var name: String lazy var greet: () -> Void = { print("Hello, \(self.name)!") } init(name: String) { self.name = name } } let p = Person(name: "Alice") p.greet()
Attempts:
2 left
💡 Hint
Think about how closures capture self by default in classes.
✗ Incorrect
The closure captures self strongly by default, and since self owns the closure, this creates a retain cycle preventing deallocation.
📝 Syntax
advanced2:00remaining
Correct capture list syntax
Which option shows the correct syntax for capturing a variable weakly in a closure?
Swift
var value = 10 let closure = { /* capture list here */ in print(value) }
Attempts:
2 left
💡 Hint
The capture list syntax uses square brackets with capture specifiers before the variable name.
✗ Incorrect
The correct syntax is [weak value]. Option C is invalid syntax, C is invalid because 'var' is not used in capture lists, and D captures self, not value.
🚀 Application
expert3:00remaining
Predict the output with multiple captures and mutation
What is the output of this Swift code?
Swift
var a = 1 var b = 2 let closure = { [a, b] in print("a = \(a), b = \(b)") } a = 3 b = 4 closure()
Attempts:
2 left
💡 Hint
Captured values are copied at closure creation time.
✗ Incorrect
The closure captures copies of a and b at the time of its creation, so later changes do not affect the captured values.