Bird
Raised Fist0
Swiftprogramming~10 mins

Capturing values from context in Swift - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to capture the value of 'number' inside the closure.

Swift
let number = 10
let closure = { print([1]) }
closure()
Drag options to blanks, or click blank then click option'
Anumber
Bself.number
Cnum
Dvalue
Attempts:
3 left
💡 Hint
Common Mistakes
Using a variable name that is not defined in the current scope.
Trying to use 'self.number' when 'number' is not a property.
2fill in blank
medium

Complete the code to capture the value of 'count' as a constant inside the closure.

Swift
var count = 5
let closure = { [[1]] in
    print(count)
}
count = 10
closure()
Drag options to blanks, or click blank then click option'
Avar count
Bself.count
Clet count
Dcount
Attempts:
3 left
💡 Hint
Common Mistakes
Writing 'var count' or 'let count' inside the capture list, which is invalid syntax.
Not using a capture list and expecting the closure to capture the value at definition time.
3fill in blank
hard

Fix the error in the closure to capture 'self' weakly to avoid retain cycles.

Swift
class MyClass {
    var value = 42
    func doWork() {
        let closure = { [[1] self] in
            print(self.value)
        }
        closure()
    }
}
Drag options to blanks, or click blank then click option'
Avar
Bweak
Cstrong
Dunowned
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'strong' or 'var' in the capture list, which are invalid.
Not capturing 'self' weakly, causing memory leaks.
4fill in blank
hard

Fill both blanks to capture 'value' strongly and 'count' weakly inside the closure.

Swift
var value = 100
var count = 20
let closure = { [[1] value, [2] count] in
    print(value, count ?? 0)
}
closure()
Drag options to blanks, or click blank then click option'
Avalue
Bweak
Cunowned
Dstrong
Attempts:
3 left
💡 Hint
Common Mistakes
Trying to write 'strong value' which is invalid syntax.
Not using 'weak' before 'count' to capture it weakly.
5fill in blank
hard

Fill all three blanks to capture 'name' unowned, 'age' weakly, and 'score' strongly inside the closure.

Swift
var name = "Alice"
var age: Int? = 30
var score = 95
let closure = { [[1] name, [2] age, [3] score] in
    print(name, age ?? 0, score)
}
closure()
Drag options to blanks, or click blank then click option'
Aunowned
Bweak
Cscore
Dname
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up the order of capture modifiers and variable names.
Trying to write 'strong score' which is invalid syntax.

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

  1. Step 1: Understand closure context

    A closure can access variables defined outside its own body, in the surrounding scope.
  2. Step 2: Capturing means referencing

    Capturing means the closure keeps a reference to those external variables so it can use them later.
  3. Final Answer:

    The closure keeps a reference to variables from its surrounding scope -> Option D
  4. Quick Check:

    Closure captures = keeps reference [OK]
Hint: Closures remember variables around them by reference [OK]
Common Mistakes:
  • Thinking closures create new independent variables
  • Believing closures cannot access outside variables
  • Confusing capture with copying values
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

  1. Step 1: Recognize capture list syntax

    To capture by value, Swift uses a capture list with syntax like [var = value].
  2. Step 2: Match correct syntax

    let closure = { [value = value] in print(value) } uses [value = value] which copies the current value into the closure.
  3. Final Answer:

    let closure = { [value = value] in print(value) } -> Option B
  4. 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

  1. Step 1: Understand reference capture

    The closure captures x by reference, so it uses the current value when called.
  2. Step 2: Check value at call time

    Since x was changed to 20 before calling the closure, it prints 20.
  3. Final Answer:

    20 -> Option A
  4. 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

  1. Step 1: Check variable mutability

    count is a variable (var), so it can be modified inside the closure.
  2. Step 2: Verify closure behavior

    The closure increments count by 1, then printing count outputs 1.
  3. Final Answer:

    No error; code runs and prints 1 -> Option A
  4. 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

  1. Step 1: Understand default capture behavior

    By default, closures capture variables by reference, so changes affect the closure.
  2. 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.
  3. Final Answer:

    Use a capture list to copy the variable value inside the closure -> Option C
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard