BuildOptional and buildEither help you create flexible code blocks that can include optional parts or choose between two options easily.
BuildOptional and buildEither in 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.
func buildOptional(_ component: String?) -> String? { return component } let optionalText = buildOptional("Hello" as String?) let noText = buildOptional(nil)
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")
This program shows how buildOptional returns a value or nil, and how buildEither picks between two choices.
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)
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.
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
buildOptional in Swift's result builders?Solution
Step 1: Understand buildOptional's role
buildOptionalis designed to handle optional code blocks, allowing them to be included if present or skipped if nil.Step 2: Compare with other builder functions
buildEitherchooses between two paths, butbuildOptionalspecifically wraps optional code, making it flexible for optional UI parts.Final Answer:
To wrap optional code blocks so they can be included or skipped -> Option BQuick Check:
buildOptional wraps optionals = B [OK]
- Confusing buildOptional with buildEither
- Thinking buildOptional forces unwrapping
- Assuming buildOptional creates loops
buildEither for choosing the first branch in a Swift result builder?Solution
Step 1: Recall buildEither syntax
The correct syntax uses named parametersfirstorsecondto specify the branch.Step 2: Identify the correct usage
buildEither(first: { Text("First") }) usesbuildEither(first: { ... }), which matches the official Swift syntax for choosing the first branch.Final Answer:
buildEither(first: { Text("First") }) -> Option CQuick Check:
buildEither first branch = A [OK]
- Using incorrect parameter names like option or branch
- Confusing first and second parameters
- Trying to pass branch as enum instead of named argument
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)Solution
Step 1: Identify which buildEither is called
The code callsbuildEither(first: "Hello"), so the first overload is used.Step 2: Understand the returned string
The first overload returns the string "First: Hello" which is printed.Final Answer:
First: Hello -> Option DQuick Check:
buildEither first branch returns "First: Hello" = A [OK]
- Assuming second branch runs when first is called
- Expecting just the input string without prefix
- Thinking this causes a compile error
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")Solution
Step 1: Identify the method call
The code callsbuildEither(third: "Oops"), but onlyfirstandsecondparameters exist.Step 2: Understand the fix
To fix, replacethirdwith eitherfirstorsecondto match the defined overloads.Final Answer:
Error: No 'third' parameter; fix by using 'first' or 'second' -> Option AQuick Check:
buildEither only accepts first or second = C [OK]
- Trying to add unsupported parameter names
- Ignoring static keyword requirements
- Assuming code runs without error
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?Solution
Step 1: Understand the conditions
We have three cases: logged in, guest mode, and neither.buildEithercan choose between logged in and guest mode views.Step 2: Use buildOptional for the third case
The third case (neither) means no view, so wrap the guest mode view inbuildOptionalto include it only if guest mode is enabled.Step 3: Combine both builders
UsebuildEitherto select logged in or guest mode, andbuildOptionalto skip guest mode if disabled, resulting in no view if neither condition is true.Final Answer:
Use buildOptional to wrap guest mode view, and buildEither to choose between logged in and guest -> Option AQuick Check:
buildOptional wraps optional guest, buildEither picks logged in or guest = D [OK]
- Using buildEither alone for optional skipping
- Using buildOptional alone for branching
- Not handling the 'no view' case properly
Ready to prove it?
Pass the test and this pattern moves unknown
