Bird
Raised Fist0
Swiftprogramming~5 mins

Autoclosures (@autoclosure) in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is an @autoclosure in Swift?
An @autoclosure automatically wraps an expression in a closure, delaying its evaluation until it's called. It lets you write cleaner code by avoiding explicit closure syntax.
Click to reveal answer
beginner
How does @autoclosure improve function call syntax?
It lets you pass an expression directly instead of a closure, making the call look simpler and more natural, while still delaying evaluation.
Click to reveal answer
intermediate
Example: What does this function signature mean?
func logIfTrue(_ predicate: @autoclosure () -> Bool)
It means you can pass a Boolean expression directly to logIfTrue, and the expression will only be evaluated inside the function when needed.
Click to reveal answer
intermediate
Why use @autoclosure instead of a normal closure?
Because it makes the call site cleaner and easier to read by letting you write expressions directly, without extra braces or { } syntax.
Click to reveal answer
advanced
Can @autoclosure be combined with @escaping? What does that mean?
Yes, combining @autoclosure with @escaping means the delayed expression can be stored and called later, not just during the function call.
Click to reveal answer
What does @autoclosure do in Swift?
AAutomatically wraps an expression in a closure delaying its evaluation
BImmediately executes a closure
CConverts a closure to a function
DPrevents a closure from capturing variables
Which is a benefit of using @autoclosure?
APrevents functions from returning values
BForces immediate evaluation of expressions
CAutomatically unwraps optionals
DSimplifies function call syntax by allowing expressions instead of closures
How do you declare a function parameter as an autoclosure?
AUse <code>inout</code> keyword
BUse <code>@autoclosure</code> before the parameter type
CUse <code>lazy</code> keyword
DUse <code>@escaping</code> before the parameter type
What happens if you combine @autoclosure with @escaping?
AThe closure can be stored and called later, not just immediately
BThe closure runs immediately
CThe closure cannot capture variables
DThe closure is converted to a synchronous function
Which of these is a correct use of @autoclosure?
Afunc check(_ condition: () -> Bool) { if condition { print("True") } }
Bfunc check(_ condition: Bool) { if condition { print("True") } }
Cfunc check(_ condition: @autoclosure () -> Bool) { if condition() { print("True") } }
Dfunc check(_ condition: @escaping Bool) { if condition { print("True") } }
Explain what @autoclosure does and why it is useful in Swift.
Think about how it changes the way you write function arguments.
You got /4 concepts.
    Describe a situation where combining @autoclosure with @escaping would be helpful.
    Consider when you want to save a condition to check later.
    You got /4 concepts.

      Practice

      (1/5)
      1. What does the @autoclosure attribute do in Swift?
      easy
      A. Converts a closure into a normal function
      B. Forces immediate execution of a closure parameter
      C. Automatically wraps an expression into a closure to delay its execution
      D. Prevents a closure from capturing variables

      Solution

      1. Step 1: Understand the purpose of @autoclosure

        @autoclosure automatically wraps an expression passed as an argument into a closure, delaying its execution until called.
      2. Step 2: Compare with other options

        Options B, C, and D describe behaviors unrelated to @autoclosure's purpose.
      3. Final Answer:

        Automatically wraps an expression into a closure to delay its execution -> Option C
      4. Quick Check:

        @autoclosure delays execution = A [OK]
      Hint: Autoclosure delays code execution by wrapping it automatically [OK]
      Common Mistakes:
      • Thinking @autoclosure runs code immediately
      • Confusing @autoclosure with normal closures
      • Assuming it changes closure syntax
      2. Which of the following is the correct way to declare a function parameter using @autoclosure in Swift?
      easy
      A. func check(_ condition: @autoclosure () -> Bool) { }
      B. func check(@autoclosure condition: Bool) { }
      C. func check(condition: @autoclosure Bool) { }
      D. func check(_ condition: Bool @autoclosure) { }

      Solution

      1. Step 1: Recall correct syntax for @autoclosure

        The correct syntax places @autoclosure before the closure type: @autoclosure () -> Bool.
      2. Step 2: Analyze each option

        func check(_ condition: @autoclosure () -> Bool) { } matches the correct syntax. Options A, B, and C misuse the attribute placement or type declaration.
      3. Final Answer:

        func check(_ condition: @autoclosure () -> Bool) { } -> Option A
      4. Quick Check:

        @autoclosure syntax = func check(_ condition: @autoclosure () -> Bool) { } [OK]
      Hint: Remember: @autoclosure before closure type () -> Type [OK]
      Common Mistakes:
      • Placing @autoclosure after the type
      • Using @autoclosure on non-closure types
      • Omitting the closure arrow syntax
      3. What will be the output of the following Swift code?
      func logIfTrue(_ predicate: @autoclosure () -> Bool) {
          if predicate() {
              print("True")
          } else {
              print("False")
          }
      }
      
      logIfTrue(3 > 5)
      medium
      A. True
      B. Runtime crash
      C. Compile-time error
      D. False

      Solution

      1. Step 1: Understand the function behavior

        The function takes a condition as an autoclosure and calls it inside the if statement.
      2. Step 2: Evaluate the passed expression

        The expression 3 > 5 is false, so predicate() returns false, triggering the else branch.
      3. Final Answer:

        False -> Option D
      4. Quick Check:

        3 > 5 is false, so output = False [OK]
      Hint: Evaluate the expression inside autoclosure when called [OK]
      Common Mistakes:
      • Assuming autoclosure runs immediately before function call
      • Confusing true/false logic
      • Expecting compile errors due to autoclosure
      4. Identify the error in this Swift function using @autoclosure:
      func execute(_ action: @autoclosure () -> Void) {
          action
      }
      
      execute(print("Hello"))
      medium
      A. Missing parentheses to call the closure inside the function
      B. Incorrect use of @autoclosure on a Void return type
      C. Cannot pass print statement as autoclosure
      D. Function parameter should not be marked @autoclosure

      Solution

      1. Step 1: Check how the closure is called inside the function

        The parameter action is a closure and must be called with parentheses: action().
      2. Step 2: Identify the error

        The code uses action without parentheses, so the closure is not executed, causing no output.
      3. Final Answer:

        Missing parentheses to call the closure inside the function -> Option A
      4. Quick Check:

        Closure must be called with () = Missing parentheses to call the closure inside the function [OK]
      Hint: Call autoclosure with () to execute it inside function [OK]
      Common Mistakes:
      • Forgetting to call the closure with parentheses
      • Thinking @autoclosure forbids Void closures
      • Assuming print can't be autoclosure
      5. Consider this Swift code using @autoclosure to log messages only when needed:
      func log(_ message: @autoclosure () -> String, onlyIf condition: Bool) {
          if condition {
              print(message())
          }
      }
      
      log("Debug info", onlyIf: false)

      What is the main benefit of using @autoclosure here?
      hard
      A. The function runs faster because closures are always synchronous
      B. The message string is constructed only if the condition is true, saving resources
      C. The message is printed twice automatically
      D. The condition parameter becomes optional

      Solution

      1. Step 1: Understand how @autoclosure delays evaluation

        The message string expression is wrapped in a closure and only evaluated when message() is called.
      2. Step 2: Analyze the condition effect

        Since condition is false, message() is never called, so the string is not constructed, saving computation.
      3. Final Answer:

        The message string is constructed only if the condition is true, saving resources -> Option B
      4. Quick Check:

        @autoclosure delays message creation = The message string is constructed only if the condition is true, saving resources [OK]
      Hint: Autoclosure delays expensive expressions until needed [OK]
      Common Mistakes:
      • Thinking message is always created regardless of condition
      • Assuming autoclosure prints automatically
      • Confusing condition with message parameter
      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