Bird
Raised Fist0
Swiftprogramming~20 mins

BuildOptional and buildEither in Swift - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Swift BuildOptional & BuildEither Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Swift code using buildOptional?
Consider this Swift code snippet using buildOptional in a result builder. What will be printed?
Swift
import Foundation

@resultBuilder
struct TestBuilder {
    static func buildOptional(_ component: String?) -> String {
        return component ?? "No value"
    }

    static func buildBlock(_ component: String) -> String {
        return component
    }
}

func test() -> String {
    @TestBuilder var result: String {
        if Bool.random() {
            "Hello"
        }
    }
    return result
}

print(test())
AAlways "Hello"
BCompilation error due to missing else
CAlways "No value"
D"Hello" or "No value" depending on random condition
Attempts:
2 left
💡 Hint
buildOptional handles optional components in result builders, returning a default if nil.
❓ Predict Output
intermediate
2:00remaining
What does this Swift code print using buildEither?
Given this Swift code using buildEither in a result builder, what will be the output?
Swift
import Foundation

@resultBuilder
struct EitherBuilder {
    static func buildEither(first component: String) -> String {
        return "First: " + component
    }

    static func buildEither(second component: String) -> String {
        return "Second: " + component
    }

    static func buildBlock(_ component: String) -> String {
        return component
    }
}

func test(flag: Bool) -> String {
    @EitherBuilder var result: String {
        if flag {
            "Option A"
        } else {
            "Option B"
        }
    }
    return result
}

print(test(flag: true))
print(test(flag: false))
A"First: Option A\nSecond: Option B"
B"Option A\nOption B"
C"First: Option A\nFirst: Option A"
D"First: Option A\nOption B"
ECompilation error due to ambiguous buildEither
Attempts:
2 left
💡 Hint
buildEither distinguishes between first and second branches in conditional statements inside result builders.
🔧 Debug
advanced
2:30remaining
Why does this Swift code using buildEither cause a compilation error?
Examine this Swift code snippet using buildEither. Why does it fail to compile?
Swift
import Foundation

@resultBuilder
struct MyBuilder {
    static func buildEither(first component: Int) -> Int {
        return component
    }

    static func buildEither(second component: String) -> String {
        return component
    }

    static func buildBlock(_ component: Any) -> Any {
        return component
    }
}

func test(flag: Bool) -> Any {
    @MyBuilder var result: Any {
        if flag {
            42
        } else {
            "Answer"
        }
    }
    return result
}
AUsing Any as return type is not allowed in result builders
BbuildBlock must return the same type as buildEither
CbuildEither methods have different return types causing ambiguity
DMissing buildOptional method causes error
Attempts:
2 left
💡 Hint
Result builder functions must have consistent return types to compile.
🧠 Conceptual
advanced
1:30remaining
How does buildOptional affect the output in a Swift result builder?
In Swift result builders, what role does buildOptional play when an optional component is present?
AIt unwraps the optional and provides a default value if nil
BIt forces the optional to be non-nil or causes a runtime error
CIt ignores the optional component completely if nil
DIt converts the optional to a string representation regardless of value
Attempts:
2 left
💡 Hint
Think about how optional values are handled inside result builders.
❓ Predict Output
expert
3:00remaining
What is the output of this complex Swift result builder using buildEither and buildOptional?
Analyze this Swift code using both buildEither and buildOptional in a result builder. What will it print?
Swift
import Foundation

@resultBuilder
struct ComplexBuilder {
    static func buildBlock(_ components: String...) -> String {
        components.joined(separator: ", ")
    }

    static func buildEither(first component: String) -> String {
        "First(\(component))"
    }

    static func buildEither(second component: String) -> String {
        "Second(\(component))"
    }

    static func buildOptional(_ component: String?) -> String {
        component ?? "None"
    }
}

func complexTest(flag1: Bool, flag2: Bool) -> String {
    @ComplexBuilder var result: String {
        if flag1 {
            "A"
        } else {
            "B"
        }
        if flag2 {
            "C"
        }
    }
    return result
}

print(complexTest(flag1: true, flag2: true))
print(complexTest(flag1: false, flag2: false))
A"A, C" and "B"
B"First(A), C" and "Second(B), None"
C"First(A), C" and "Second(B), C"
D"First(A), C" and "Second(B)"
Attempts:
2 left
💡 Hint
buildEither wraps the if-else branches, buildOptional handles the optional second if.

Practice

(1/5)
1. What is the main purpose of buildOptional in Swift's result builders?
easy
A. To choose between two code paths explicitly
B. To wrap optional code blocks so they can be included or skipped
C. To force unwrap optionals in code blocks
D. To create loops inside result builders

Solution

  1. Step 1: Understand buildOptional's role

    buildOptional is designed to handle optional code blocks, allowing them to be included if present or skipped if nil.
  2. Step 2: Compare with other builder functions

    buildEither chooses between two paths, but buildOptional specifically wraps optional code, making it flexible for optional UI parts.
  3. Final Answer:

    To wrap optional code blocks so they can be included or skipped -> Option B
  4. Quick Check:

    buildOptional wraps optionals = B [OK]
Hint: Remember: buildOptional handles optionals, buildEither picks sides [OK]
Common Mistakes:
  • Confusing buildOptional with buildEither
  • Thinking buildOptional forces unwrapping
  • Assuming buildOptional creates loops
2. Which of the following is the correct syntax to use buildEither for choosing the first branch in a Swift result builder?
easy
A. buildEither(option: 1) { Text("First") }
B. buildEither(second: { Text("First") })
C. buildEither(first: { Text("First") })
D. buildEither(branch: .first, content: { Text("First") })

Solution

  1. Step 1: Recall buildEither syntax

    The correct syntax uses named parameters first or second to specify the branch.
  2. Step 2: Identify the correct usage

    buildEither(first: { Text("First") }) uses buildEither(first: { ... }), which matches the official Swift syntax for choosing the first branch.
  3. Final Answer:

    buildEither(first: { Text("First") }) -> Option C
  4. Quick Check:

    buildEither first branch = A [OK]
Hint: Use named parameters first or second with buildEither [OK]
Common Mistakes:
  • Using incorrect parameter names like option or branch
  • Confusing first and second parameters
  • Trying to pass branch as enum instead of named argument
3. What will be the output of this Swift code using buildEither?
enum ResultBuilder {
  static func buildEither(first: String) -> String { "First: \(first)" }
  static func buildEither(second: String) -> String { "Second: \(second)" }
}

let result = ResultBuilder.buildEither(first: "Hello")
print(result)
medium
A. Compilation error
B. Second: Hello
C. Hello
D. First: Hello

Solution

  1. Step 1: Identify which buildEither is called

    The code calls buildEither(first: "Hello"), so the first overload is used.
  2. Step 2: Understand the returned string

    The first overload returns the string "First: Hello" which is printed.
  3. Final Answer:

    First: Hello -> Option D
  4. Quick Check:

    buildEither first branch returns "First: Hello" = A [OK]
Hint: Check which named parameter is used: first or second [OK]
Common Mistakes:
  • Assuming second branch runs when first is called
  • Expecting just the input string without prefix
  • Thinking this causes a compile error
4. Given this Swift code snippet, what is the error and how to fix it?
struct Builder {
  @resultBuilder
  struct MyBuilder {
    static func buildEither(first: String) -> String { first }
    static func buildEither(second: String) -> String { second }
  }
}

let value = Builder.MyBuilder.buildEither(third: "Oops")
medium
A. Error: No 'third' parameter; fix by using 'first' or 'second'
B. Error: Missing return statement; fix by adding return
C. Error: buildEither cannot be static; remove static keyword
D. No error; code runs fine

Solution

  1. Step 1: Identify the method call

    The code calls buildEither(third: "Oops"), but only first and second parameters exist.
  2. Step 2: Understand the fix

    To fix, replace third with either first or second to match the defined overloads.
  3. Final Answer:

    Error: No 'third' parameter; fix by using 'first' or 'second' -> Option A
  4. Quick Check:

    buildEither only accepts first or second = C [OK]
Hint: Use only first or second parameters with buildEither [OK]
Common Mistakes:
  • Trying to add unsupported parameter names
  • Ignoring static keyword requirements
  • Assuming code runs without error
5. How can you use buildOptional and buildEither together to conditionally build a SwiftUI view that shows "Logged In" if a user is logged in, "Guest" if not logged in but guest mode is enabled, and nothing otherwise?
hard
A. Use buildOptional to wrap guest mode view, and buildEither to choose between logged in and guest
B. Use buildEither to wrap guest mode view, and buildOptional to choose between logged in and guest
C. Use only buildOptional for all conditions
D. Use only buildEither for all conditions

Solution

  1. Step 1: Understand the conditions

    We have three cases: logged in, guest mode, and neither. buildEither can choose between logged in and guest mode views.
  2. Step 2: Use buildOptional for the third case

    The third case (neither) means no view, so wrap the guest mode view in buildOptional to include it only if guest mode is enabled.
  3. Step 3: Combine both builders

    Use buildEither to select logged in or guest mode, and buildOptional to skip guest mode if disabled, resulting in no view if neither condition is true.
  4. Final Answer:

    Use buildOptional to wrap guest mode view, and buildEither to choose between logged in and guest -> Option A
  5. Quick Check:

    buildOptional wraps optional guest, buildEither picks logged in or guest = D [OK]
Hint: buildEither picks branches; buildOptional skips optional parts [OK]
Common Mistakes:
  • Using buildEither alone for optional skipping
  • Using buildOptional alone for branching
  • Not handling the 'no view' case properly
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