Bird
Raised Fist0
Swiftprogramming~5 mins

BuildOptional and buildEither in Swift

Choose your learning style10 modes available
Introduction

BuildOptional and buildEither help you create flexible code blocks that can include optional parts or choose between two options easily.

When you want to include a piece of code only if a condition is true.
When you need to pick one of two possible code paths.
When building user interfaces that may or may not show certain elements.
When handling different cases in a clean and readable way.
Syntax
Swift
func buildOptional(_ component: Component?) -> Component?
func buildEither(first component: Component) -> Component
func buildEither(second component: Component) -> Component

buildOptional wraps an optional component, allowing you to include or skip it.

buildEither lets you choose between two components, marking one as first or second.

Examples
This example shows how buildOptional returns the string if it exists or nil if it doesn't.
Swift
func buildOptional(_ component: String?) -> String? {
    return component
}

let optionalText = buildOptional("Hello" as String?)
let noText = buildOptional(nil)
This example shows how buildEither picks between two options, labeling them as first or second.
Swift
func buildEither(first component: String) -> String {
    return "First: \(component)"
}

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

let firstChoice = buildEither(first: "Option A")
let secondChoice = buildEither(second: "Option B")
Sample Program

This program shows how buildOptional returns a value or nil, and how buildEither picks between two choices.

Swift
import Foundation

// Simulate buildOptional
func buildOptional(_ component: String?) -> String? {
    return component
}

// Simulate buildEither
func buildEither(first component: String) -> String {
    return "First choice: \(component)"
}

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

// Using buildOptional
let optionalGreeting = buildOptional("Hello, friend!" as String?)
let noGreeting = buildOptional(nil)

// Using buildEither
let choice1 = buildEither(first: "Coffee")
let choice2 = buildEither(second: "Tea")

print(optionalGreeting ?? "No greeting")
print(noGreeting ?? "No greeting")
print(choice1)
print(choice2)
OutputSuccess
Important Notes

buildOptional helps you include code only if it exists, like showing a message if available.

buildEither is useful for choosing between two paths, like picking one option in a menu.

These functions are often used in Swift's result builders to make code cleaner and easier to read.

Summary

buildOptional wraps optional parts of code to include or skip them.

buildEither chooses between two code options, marking one as first or second.

They help write flexible and readable Swift code, especially in UI building.

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