Bird
Raised Fist0
Swiftprogramming~20 mins

Why functions are first-class in Swift - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Swift Functions Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of function assigned to a variable

What is the output of this Swift code?

Swift
func greet(name: String) -> String {
    return "Hello, \(name)!"
}

let greeter = greet
print(greeter("Alice"))
AError: Cannot assign function to variable
Bgreet
CHello, greeter!
DHello, Alice!
Attempts:
2 left
💡 Hint

Remember, in Swift, functions can be assigned to variables and called through them.

🧠 Conceptual
intermediate
1:30remaining
Why can Swift functions be passed as arguments?

Why can Swift functions be passed as arguments to other functions?

ABecause Swift automatically converts functions to strings when passed as arguments.
BBecause functions are treated as values and can be stored in variables or passed around.
CBecause functions are only allowed as global variables in Swift.
DBecause Swift does not support passing functions as arguments.
Attempts:
2 left
💡 Hint

Think about what it means for functions to be 'first-class'.

🔧 Debug
advanced
2:30remaining
Identify the error when returning a function

What error does this Swift code produce?

Swift
func makeIncrementer() -> (Int) -> Int {
    func addOne(number: Int) -> Int {
        return number + 1
    }
    return addOne
}
AError: Cannot call function when returning, should return function itself
BNo error, returns a function correctly
CError: Missing return type for inner function
DError: addOne is not defined
Attempts:
2 left
💡 Hint

Look carefully at what is returned: the function call or the function itself?

📝 Syntax
advanced
1:30remaining
Correct syntax for function type variable

Which option correctly declares a variable that holds a function taking an Int and returning a String?

Avar converter: (Int) -> String
Bvar converter: (Int) => String
Cvar converter: Int -> String
Dvar converter = Int -> String
Attempts:
2 left
💡 Hint

Remember the syntax for function types in Swift uses parentheses and arrow.

🚀 Application
expert
3:00remaining
Using functions as first-class citizens to sort an array

Given this Swift code, which option correctly sorts the array numbers in descending order using a function passed as an argument?

Swift
let numbers = [3, 1, 4, 2]

func descending(_ a: Int, _ b: Int) -> Bool {
    return a > b
}

let sortedNumbers = numbers.sorted(by: ???)
print(sortedNumbers)
A{ a, b in a < b }
Bdescending()
Cdescending
Dnumbers.descending
Attempts:
2 left
💡 Hint

When passing a function as an argument, do you call it or just pass its name?

Practice

(1/5)
1. Why are functions considered first-class citizens in Swift?
easy
A. Because functions can be assigned to variables and passed as arguments
B. Because functions cannot return values
C. Because functions must always be declared globally
D. Because functions cannot be nested inside other functions

Solution

  1. Step 1: Understand what first-class means in Swift

    First-class means functions can be treated like any other value, such as assigned to variables or passed around.
  2. Step 2: Identify the correct property of functions in Swift

    Swift allows functions to be stored in variables and passed as arguments, which matches the definition of first-class citizens.
  3. Final Answer:

    Because functions can be assigned to variables and passed as arguments -> Option A
  4. Quick Check:

    Functions as values = Because functions can be assigned to variables and passed as arguments [OK]
Hint: Remember: first-class means functions act like normal values [OK]
Common Mistakes:
  • Thinking functions cannot be passed as arguments
  • Believing functions must be global only
  • Assuming functions cannot return values
2. Which of the following is the correct way to assign a function to a variable in Swift?
easy
A. let greet = func sayHello() { print("Hello") }
B. let greet = sayHello
C. func greet = sayHello()
D. var greet: sayHello = func()

Solution

  1. Step 1: Recall Swift syntax for assigning functions

    In Swift, you assign a function by its name without parentheses to a variable or constant.
  2. Step 2: Check each option for correct syntax

    let greet = sayHello correctly assigns the function name without calling it. Other options have syntax errors or misuse keywords.
  3. Final Answer:

    let greet = sayHello -> Option B
  4. Quick Check:

    Assign function by name without () = let greet = sayHello [OK]
Hint: Assign function by name only, no parentheses [OK]
Common Mistakes:
  • Adding parentheses when assigning function
  • Using 'func' keyword in assignment
  • Incorrect variable declaration syntax
3. What will be the output of this Swift code?
func multiplyByTwo(_ number: Int) -> Int {
    return number * 2
}

let operation = multiplyByTwo
print(operation(5))
medium
A. 5
B. multiplyByTwo
C. 10
D. Error: Cannot assign function to variable

Solution

  1. Step 1: Understand function assignment and call

    The function multiplyByTwo is assigned to 'operation' without calling it, so 'operation' is a function reference.
  2. Step 2: Call the function through the variable

    Calling operation(5) runs multiplyByTwo(5), which returns 5 * 2 = 10.
  3. Final Answer:

    10 -> Option C
  4. Quick Check:

    Function call via variable returns 10 [OK]
Hint: Calling assigned function runs original logic [OK]
Common Mistakes:
  • Expecting variable to hold result, not function
  • Confusing function name with string output
  • Thinking assignment causes error
4. Identify the error in this Swift code snippet:
func add(_ a: Int, _ b: Int) -> Int {
    return a + b
}

let sum = add(3, 4)
let operation = add(3, 4)
print(operation(5, 6))
medium
A. Function add is not defined properly
B. Missing return statement in add function
C. Cannot assign function call to a constant
D. Cannot call operation as a function because it holds an Int, not a function

Solution

  1. Step 1: Analyze variable assignments

    sum is assigned the result of add(3, 4), which is an Int (7). operation is also assigned add(3, 4), so operation is an Int, not a function.
  2. Step 2: Check the call to operation(5, 6)

    Since operation is an Int, calling operation(5, 6) causes an error because Int is not callable.
  3. Final Answer:

    Cannot call operation as a function because it holds an Int, not a function -> Option D
  4. Quick Check:

    Calling Int as function causes error = Cannot call operation as a function because it holds an Int, not a function [OK]
Hint: Assign function name, not function call, to variable [OK]
Common Mistakes:
  • Assigning function call instead of function reference
  • Expecting function call to be callable again
  • Ignoring type mismatch errors
5. How can you write a Swift function that returns another function which adds a fixed number to its input? For example, calling makeAdder(3)(5) should return 8.
hard
A. func makeAdder(_ x: Int) -> (Int) -> Int { return { y in x + y } }
B. func makeAdder(_ x: Int) -> Int { return x + y }
C. func makeAdder(x: Int, y: Int) -> Int { return x + y }
D. func makeAdder(_ x: Int) -> (Int) { return x }

Solution

  1. Step 1: Understand the requirement for returning a function

    The function makeAdder must return another function that takes an Int and adds it to x.
  2. Step 2: Check which option returns a function type

    func makeAdder(_ x: Int) -> (Int) -> Int { return { y in x + y } } returns a closure (function) of type (Int) -> Int that adds x and y, matching the requirement.
  3. Final Answer:

    func makeAdder(_ x: Int) -> (Int) -> Int { return { y in x + y } } -> Option A
  4. Quick Check:

    Return function adding x to input = func makeAdder(_ x: Int) -> (Int) -> Int { return { y in x + y } } [OK]
Hint: Return a closure capturing x to add later [OK]
Common Mistakes:
  • Returning Int instead of function
  • Not using closure syntax for returned function
  • Incorrect function signature
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