📖 Scenario: You are creating a simple Swift program that combines results from multiple operations using a buildBlock function. This is useful when you want to gather multiple values into one combined result.
🎯 Goal: Build a Swift function using @resultBuilder with a buildBlock method that combines multiple String results into one concatenated String. Then use this builder to combine several strings and print the final combined string.
📋 What You'll Learn
Create a @resultBuilder struct named StringCombiner with a static buildBlock method that takes multiple String parameters and returns their concatenation.
Create a function combineStrings that uses @StringCombiner to combine multiple strings.
Call combineStrings with three specific strings: "Hello, ", "Swift ", and "World!".
Print the combined result.
💡 Why This Matters
🌍 Real World
Result builders in Swift help combine multiple pieces of data or code blocks into one result, making code cleaner and easier to read, especially in UI building or DSLs.
💼 Career
Understanding result builders is useful for Swift developers working on SwiftUI, server-side Swift, or any code that benefits from declarative syntax and combining multiple values.
Progress0 / 4 steps
1
Create the @resultBuilder struct
Create a @resultBuilder struct called StringCombiner with a static method buildBlock that takes a variable number of String parameters and returns a single String by concatenating them.
Swift
Hint
Use @resultBuilder before the struct. The buildBlock method should join all strings in components.
2
Create the combineStrings function using StringCombiner
Create a function called combineStrings that uses the @StringCombiner attribute. This function should return a String and accept a closure that returns multiple String values.
Swift
Hint
Use @StringCombiner before the function and the closure parameter. Return the result of calling content().
3
Call combineStrings with three strings
Call the function combineStrings with a closure that returns these exact strings in order: "Hello, ", "Swift ", and "World!".
Swift
Hint
Call combineStrings with a closure containing the three strings on separate lines.
4
Print the combined result
Print the variable result to display the combined string.
Swift
Hint
Use print(result) to show the combined string.
Practice
(1/5)
1. What does BuildBlock do when combining multiple Result values in Swift?
easy
A. It returns failure only if all Result values are failures.
B. It returns failure if any Result is failure, otherwise success.
C. It always returns success regardless of individual results.
D. It merges all success values into an array without checking failures.
Solution
Step 1: Understand BuildBlock behavior
BuildBlock combines multiple Result values and checks each one.
Step 2: Check failure condition
If any Result is a failure, the combined result is failure; otherwise, it is success.
Final Answer:
It returns failure if any Result is failure, otherwise success. -> Option B
Quick Check:
Failure if any fail = C [OK]
Hint: Remember: one failure causes whole BuildBlock to fail [OK]
Common Mistakes:
Assuming it returns success if any result is success
Thinking it merges all successes without failure check
Believing it fails only if all results fail
2. Which of the following is the correct syntax to combine two Result values using BuildBlock in Swift?
easy
A. BuildBlock(result1, result2)
B. BuildBlock[result1, result2]
C. BuildBlock{result1, result2}
D. BuildBlock->(result1, result2)
Solution
Step 1: Recall BuildBlock usage
BuildBlock is called like a function with comma-separated arguments inside parentheses.
Step 2: Identify correct syntax
Only BuildBlock(result1, result2) matches the correct function call syntax.
Final Answer:
BuildBlock(result1, result2) -> Option A
Quick Check:
Function call syntax = A [OK]
Hint: Use parentheses for function calls, not brackets or braces [OK]
Common Mistakes:
Using square brackets instead of parentheses
Using braces which are for closures
Using arrow syntax which is invalid here
3. What is the output of this Swift code?
let r1: Result = .success(10)
let r2: Result = .failure(NSError(domain: "", code: 1))
let combined = BuildBlock(r1, r2)
switch combined {
case .success(let values): print(values)
case .failure(let error): print("Error code: \((error as NSError).code)")
}
medium
A. Error code: 1
B. 10
C. Error code: 0
D. Compilation error
Solution
Step 1: Analyze input results
r1 is success with 10, r2 is failure with error code 1.
Step 2: Understand BuildBlock combining
Since r2 is failure, combined result is failure with that error.
Step 3: Switch prints error code
The failure case prints "Error code: 1" from the NSError code.
Final Answer:
Error code: 1 -> Option A
Quick Check:
Failure present, print error code 1 = A [OK]
Hint: If any result fails, output error info, not success value [OK]
Common Mistakes:
Assuming success prints 10 despite failure
Confusing error code with 0
Expecting compilation error due to BuildBlock
4. Identify the error in this Swift code using BuildBlock:
let r1: Result = .success("Hi")
let r2: Result = .success("There")
let combined = BuildBlock(r1 + r2)
medium
A. BuildBlock cannot combine success values.
B. BuildBlock requires at least three arguments.
C. Result types must be integers to combine.
D. You cannot use + operator directly on Result types.
Solution
Step 1: Check operator usage on Result
The code tries to add two Result values with +, which is invalid.
Step 2: Understand correct BuildBlock usage
BuildBlock takes multiple Result arguments separately, not combined with +.
Final Answer:
You cannot use + operator directly on Result types. -> Option D
Quick Check:
+ operator invalid on Result = D [OK]
Hint: Pass results as separate arguments, not combined with + [OK]
Common Mistakes:
Trying to add Result values directly
Thinking BuildBlock needs 3+ arguments
Believing only integers can be combined
5. You have three Result values:
let r1: Result = .success(5)
let r2: Result = .success(10)
let r3: Result = .success(15)
Using BuildBlock, how can you combine them to get a single Result with an array of all success values?
hard
A. Use BuildBlock(r1, r2, r3) directly; it returns array of values.
B. Use BuildBlock(r1, r2, r3).flatMap { [$0 + $1 + $2] }
C. Use BuildBlock(r1, r2, r3).map { [$0, $1, $2] }
D. Use BuildBlock([r1, r2, r3]) to combine into array.
Solution
Step 1: Understand BuildBlock output
It combines multiple Result values into a single Result with a tuple of success values.
Step 2: Convert tuple to array
Use map to transform the tuple ($0, $1, $2) into an array [$0, $1, $2].
Final Answer:
Use BuildBlock(r1, r2, r3).map { [$0, $1, $2] } -> Option C
Quick Check:
Map tuple to array after BuildBlock = B [OK]
Hint: BuildBlock returns tuple; map it to array for combined values [OK]
Common Mistakes:
Expecting BuildBlock to return array directly
Using flatMap incorrectly to sum values
Passing array of results instead of separate arguments
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.