📖 Scenario: Imagine you are building a simple app that needs to greet users differently based on the time of day. You want to use a small piece of reusable code that can be passed around and run later, like a little helper. This is where closures come in handy in Swift.
🎯 Goal: You will create a closure that stores a greeting message, then use it to greet users. This will show how closures can hold code and data together, making your app flexible and easy to change.
📋 What You'll Learn
Create a closure that returns a greeting string
Store the closure in a variable called greetingClosure
Call the closure and store the result in a variable called greetingMessage
Print the greetingMessage to the console
💡 Why This Matters
🌍 Real World
Closures are used in Swift apps to handle user actions, network responses, and animations by passing small pieces of code that run later.
💼 Career
Understanding closures is essential for Swift developers because they are used everywhere in iOS and macOS app development, making code cleaner and more powerful.
Progress0 / 4 steps
1
Create a closure that returns a greeting
Create a closure called greetingClosure that returns the string "Hello, Swift learner!".
Swift
Hint
Use let greetingClosure = { "Hello, Swift learner!" } to create a closure that returns a string.
2
Call the closure and store the result
Call the closure greetingClosure and store its result in a variable called greetingMessage.
Swift
Hint
Call the closure by adding () after its name and assign it to greetingMessage.
3
Print the greeting message
Print the variable greetingMessage to the console using print.
Swift
Hint
Use print(greetingMessage) to show the message on the console.
4
Modify the closure to accept a name
Change the closure greetingClosure to accept a String parameter called name and return a greeting like "Hello, \(name)!". Then call it with the name "Anna" and print the result.
Swift
Hint
Define the closure with a parameter and use in to separate parameters from the body. Use string interpolation to include the name.
Practice
(1/5)
1. What is a closure in Swift? Closures are best described as:
easy
A. A type of variable that stores numbers
B. Blocks of code that can be saved and used later
C. A special kind of loop
D. A way to declare constants
Solution
Step 1: Understand the definition of closures
Closures are self-contained blocks of functionality that can be passed around and used in your code.
Step 2: Match the description to the options
Blocks of code that can be saved and used later correctly describes closures as blocks of code saved for later use, unlike variables, loops, or constants.
Final Answer:
Blocks of code that can be saved and used later -> Option B
Quick Check:
Closure = reusable code block [OK]
Hint: Closures are like saved recipes for code [OK]
Common Mistakes:
Confusing closures with variables
Thinking closures are loops
Mixing closures with constants
2. Which of the following is the correct syntax to declare a closure that explicitly takes no parameters and returns an Int?
easy
A. let closure = { () -> Int in return 5 }
B. let closure = (Int) -> { 5 }
C. let closure = { return 5 }
D. let closure = func() -> Int { 5 }
Solution
Step 1: Recall closure syntax in Swift
A closure with no parameters and returning Int is declared as { () -> Int in ... }.
Step 2: Check each option
let closure = { () -> Int in return 5 } matches the correct syntax. let closure = { return 5 } misses return type and parameters. let closure = (Int) -> { 5 } is invalid syntax. let closure = func() -> Int { 5 } uses function syntax, not closure.
Final Answer:
let closure = { () -> Int in return 5 } -> Option A
Hint: Closure syntax uses braces with 'in' keyword [OK]
Common Mistakes:
Omitting 'in' keyword
Using function syntax instead of closure
Missing return type when needed
3. What will be printed by this Swift code?
let multiplyByTwo = { (number: Int) -> Int in
return number * 2
}
print(multiplyByTwo(4))
medium
A. Error
B. 4
C. 2
D. 8
Solution
Step 1: Understand the closure behavior
The closure takes an Int and returns that number multiplied by 2.
Step 2: Calculate the output for input 4
4 * 2 = 8, so the print statement outputs 8.
Final Answer:
8 -> Option D
Quick Check:
4 * 2 = 8 [OK]
Hint: Multiply input by 2 inside closure [OK]
Common Mistakes:
Confusing input and output values
Expecting the closure to print automatically
Syntax errors in closure call
4. Identify the error in this closure declaration:
let greet = { name: String in
print("Hello, \(name)!")
}
medium
A. Missing parentheses around parameters
B. Missing 'in' keyword
C. Closure must return a value
D. Incorrect print syntax
Solution
Step 1: Check closure parameter syntax
Closure parameters must include types inside parentheses, like (name: String).
Step 2: Identify the error in given code
The code misses parentheses around parameters.
Final Answer:
Missing parentheses around parameters -> Option A
Quick Check:
Parameters need types in parentheses [OK]
Hint: Always put parameters and types in parentheses [OK]
Common Mistakes:
Omitting parentheses around parameters
Forgetting parameter types
Assuming closures must return values
5. How can closures capture values from their surrounding context? Consider this code:
func makeIncrementer(amount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += amount
return total
}
return incrementer
}
let incrementByTen = makeIncrementer(amount: 10)
print(incrementByTen())
print(incrementByTen())
What will be the output?
hard
A. 0 and 10
B. 10 and 10
C. 10 and 20
D. Error because total is not accessible
Solution
Step 1: Understand closure capturing
The closure captures the variable 'total' from its surrounding context and modifies it each time it runs.
Step 2: Trace the output of two calls
First call adds 10 to total (0 + 10 = 10), second call adds 10 again (10 + 10 = 20).
Final Answer:
10 and 20 -> Option C
Quick Check:
Closures capture and update variables [OK]
Hint: Closures remember and update outside variables [OK]
Common Mistakes:
Assuming closures do not keep state
Thinking total resets each call
Expecting errors due to variable scope
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.