Bird
Raised Fist0
Swiftprogramming~5 mins

Closure expression syntax in Swift

Choose your learning style10 modes available
Introduction
Closures let you write small blocks of code that you can pass around and run later. They help make your code shorter and easier to read.
When you want to sort a list in a custom way.
When you need to run some code after a task finishes, like downloading a file.
When you want to filter items from a list based on a rule.
When you want to change how a function behaves by giving it a small piece of code.
When you want to handle user actions like button taps in a simple way.
Syntax
Swift
let closureName = { (parameters) -> ReturnType in
    // code here
}
The parameters and return type are optional if Swift can figure them out.
The 'in' keyword separates the parameters from the code inside the closure.
Examples
A closure with no parameters and no return value that prints a greeting.
Swift
let greet = { () -> Void in
    print("Hello!")
}
A closure that takes two numbers and returns their sum.
Swift
let add = { (a: Int, b: Int) -> Int in
    return a + b
}
A shorter closure that multiplies two numbers. Swift infers the return type.
Swift
let multiply = { (a: Int, b: Int) in a * b }
Using a closure with shorthand argument names to double each number in a list.
Swift
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
Sample Program
This program sorts a list of numbers using a closure that compares two numbers and returns true if the first is less than the second.
Swift
let numbers = [5, 3, 8, 1]

// Sort numbers in ascending order using a closure
let sortedNumbers = numbers.sorted { (a: Int, b: Int) -> Bool in
    return a < b
}

print("Sorted numbers:", sortedNumbers)
OutputSuccess
Important Notes
Closures can capture and use variables from the place where they are created.
You can simplify closures by removing types, return keyword, and using shorthand argument names.
Closures are similar to small functions but can be written inline.
Summary
Closures are blocks of code you can pass and run later.
They have a simple syntax with parameters, return type, and 'in' keyword.
Swift lets you write closures in shorter ways when types are clear.

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