Bird
Raised Fist0
Swiftprogramming~10 mins

Closure expression syntax in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Closure expression syntax
Start
↓
Define closure with parameters and return type
↓
Write closure body
↓
Use closure (call or assign)
↓
Closure executes and returns result
↓
End
This flow shows how a closure is defined with parameters and a return type, then used by calling it or assigning it to a variable, and finally executing to produce a result.
Execution Sample
Swift
let add = { (a: Int, b: Int) -> Int in
    return a + b
}

let result = add(3, 5)
print(result)
Defines a closure that adds two integers, calls it with 3 and 5, and prints the result.
Execution Table
StepActionEvaluationResult
1Define closure 'add' with parameters a=Int, b=Int and return IntClosure stored in 'add'Closure ready to use
2Call closure 'add' with arguments (3, 5)a=3, b=5Execute closure body
3Execute closure body: return a + b3 + 58
4Assign closure result to 'result'result = 8Variable 'result' holds 8
5Print 'result'print(8)Output: 8
💡 Closure executed and returned 8, program ends
Variable Tracker
VariableStartAfter Step 2After Step 4Final
addundefinedclosure definedclosure definedclosure defined
aundefined3undefinedundefined
bundefined5undefinedundefined
resultundefinedundefined88
Key Moments - 3 Insights
Why do we write 'in' inside the closure?
The 'in' keyword separates the closure's parameter list and return type from the closure body, as shown in step 1 of the execution_table.
Is the closure executed when it is defined or when it is called?
The closure is only executed when called, not when defined. Step 2 shows the call, and step 3 shows the execution.
Why do we need to specify parameter types and return type in the closure?
Specifying types tells Swift what inputs the closure expects and what it returns, ensuring correct usage as seen in step 1.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of 'result' after step 4?
A3
B8
C5
Dundefined
💡 Hint
Check the 'result' variable value in variable_tracker after step 4.
At which step does the closure actually perform the addition?
AStep 1
BStep 2
CStep 3
DStep 5
💡 Hint
Look at the 'Action' and 'Evaluation' columns in execution_table for when 'a + b' is calculated.
If we change the closure to return a * b instead, what would be the output at step 5?
A15
B35
C8
DError
💡 Hint
Multiplying 3 and 5 gives 15, so check the closure body logic in execution_table step 3.
Concept Snapshot
Closure expression syntax in Swift:
- Define with { (parameters) -> ReturnType in body }
- 'in' separates parameters and body
- Closure stored in variable or constant
- Call closure like a function
- Returns value from body
Example: let add = { (a: Int, b: Int) -> Int in return a + b }
Full Transcript
This visual execution trace shows how a closure expression is defined and used in Swift. First, a closure named 'add' is defined with two integer parameters and an integer return type. The 'in' keyword separates the parameters from the closure body, which returns the sum of the two parameters. The closure is then called with arguments 3 and 5, executing the body to compute 8. This result is assigned to the variable 'result' and printed. Variables 'a' and 'b' hold the input values during execution. Key points include understanding the role of 'in', when the closure executes, and why types are specified. The quiz questions reinforce these steps by asking about variable values and execution points. The snapshot summarizes the syntax and usage of closure expressions in Swift.

Practice

(1/5)
1. What is a closure in Swift?
easy
A. A special kind of loop for repeating tasks
B. A block of code that can be passed around and executed later
C. A type of variable that stores numbers only
D. A keyword used to declare functions

Solution

  1. Step 1: Understand the definition of closure

    A closure is a block of code that can be saved and run later, similar to a function but more flexible.
  2. Step 2: Compare options with closure meaning

    Only 'A block of code that can be passed around and executed later' correctly describes a closure.
  3. Final Answer:

    A block of code that can be passed around and executed later -> Option B
  4. Quick Check:

    Closure = block of code passed and run later [OK]
Hint: Closures are like saved code blocks you run later [OK]
Common Mistakes:
  • Confusing closures with variables
  • Thinking closures are loops
  • Mixing closures with function keywords
2. Which of the following is the correct syntax for a closure that takes two Ints and returns their sum?
easy
A. { a, b in a + b }
B. { (a, b) -> Int { a + b } }
C. func sum(a: Int, b: Int) -> Int { return a + b }
D. { (a: Int, b: Int) -> Int in return a + b }

Solution

  1. Step 1: Identify closure syntax components

    A closure with parameters and return type uses parentheses for parameters, '->' for return type, and 'in' before the code.
  2. Step 2: Check each option

    { (a: Int, b: Int) -> Int in return a + b } correctly uses (a: Int, b: Int) -> Int in return a + b. { a, b in a + b } omits types and requires context for type inference to compile. func sum(a: Int, b: Int) -> Int { return a + b } is a function, not a closure. { (a, b) -> Int { a + b } } has wrong braces placement and misses 'in'.
  3. Final Answer:

    { (a: Int, b: Int) -> Int in return a + b } -> Option D
  4. Quick Check:

    Closure syntax = parameters, return type, in keyword [OK]
Hint: Closure syntax: parameters, arrow, return type, then 'in' [OK]
Common Mistakes:
  • Confusing functions with closures
  • Missing 'in' keyword
  • Incorrect braces placement
3. What is the output of this Swift code?
let multiply = { (x: Int, y: Int) -> Int in x * y }
print(multiply(3, 4))
medium
A. 12
B. 7
C. 34
D. Error

Solution

  1. Step 1: Understand closure definition and call

    The closure multiply takes two Ints and returns their product (x * y). It is called with 3 and 4.
  2. Step 2: Calculate the result

    3 * 4 = 12, so print outputs 12.
  3. Final Answer:

    12 -> Option A
  4. Quick Check:

    3 times 4 = 12 [OK]
Hint: Multiply inputs inside closure to get output [OK]
Common Mistakes:
  • Adding instead of multiplying
  • Concatenating numbers as strings
  • Syntax errors in closure call
4. Find the error in this closure syntax:
let greet = { name: String in
  print("Hello, \(name)!")
}
medium
A. Parameters must be in parentheses
B. Missing 'in' keyword after parameters
C. Closure cannot print inside its body
D. Missing parameter types in closure

Solution

  1. Step 1: Check closure parameter syntax

    Closure parameters must be enclosed in parentheses, like (name: String).
  2. Step 2: Identify the error in given code

    The code uses 'name: String' without parentheses, which is invalid syntax.
  3. Final Answer:

    Parameters must be in parentheses -> Option A
  4. Quick Check:

    Closure parameters need parentheses [OK]
Hint: Always put closure parameters inside parentheses [OK]
Common Mistakes:
  • Omitting parentheses around parameters
  • Forgetting 'in' keyword
  • Thinking closures can't print
5. How can you simplify this closure expression?
let numbers = [1, 2, 3, 4]
let doubled = numbers.map({ (num: Int) -> Int in return num * 2 })
print(doubled)
hard
A. Use a for loop instead of map
B. Remove 'return' and keep full syntax: numbers.map { (num: Int) -> Int in num * 2 }
C. Use shorthand argument names: numbers.map { $0 * 2 }
D. Cannot simplify closure expressions

Solution

  1. Step 1: Understand closure simplification rules

    Swift allows removing parameter types and 'return' when the closure is a single expression, and using shorthand $0 for first parameter.
  2. Step 2: Apply shorthand argument names

    Replacing full closure with numbers.map { $0 * 2 } simplifies code and is correct.
  3. Final Answer:

    Use shorthand argument names: numbers.map { $0 * 2 } -> Option C
  4. Quick Check:

    Shorthand $0 replaces explicit parameters [OK]
Hint: Use $0, $1 for closure parameters to shorten code [OK]
Common Mistakes:
  • Keeping full syntax unnecessarily
  • Thinking closures can't be simplified
  • Replacing map with loops unnecessarily
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