0Pricing
Swift Academy · レッスン

result builderでミニDSLを構築する

@resultBuilder を使って小さなDSLを構築します。ビルダー関数を定義し、ブロックを組み合わせ、条件分岐やループにも対応して読みやすく構築できるようにします。

「result builderでミニDSLを構築する」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

Result Builder を使う理由

目的: @resultBuilderを使って、読みやすいブロックを値に変換します。要素の結合方法は自分で定義し、呼び出し側はすっきりした宣言的な記述にできます。

小さなビルダー

要素を連結するbuildBlockを宣言し、きれいなブロックから文字列の配列を返すAPI(lines{})を公開します。

@resultBuilder
struct StringListBuilder {
    static func buildBlock(_ parts: String...) -> [String] { parts }
    // Optional support for conditionals/arrays:
    static func buildEither(first: [String]) -> [String] { first }
    static func buildEither(second: [String]) -> [String] { second }
    static func buildArray(_ components: [[String]]) -> [String] { components.flatMap { $0 } }
}

// DSL entry function using the builder
func lines(@StringListBuilder _ content: () -> [String]) -> [String] {
    content()
}

// Usage: create an array of strings with a block
let list = lines {
    "Hello"
    "Swift"
    "Builders"
}
print(list)

ビルダー内の条件分岐

buildEitherを使うと、ブロック内でif/elseを使用できます。どの分岐を組み込むかはビルダーが決定します。

let showExtra = true
let conditional = lines {
    "Base"
    if showExtra {
        "Extra"
    } else {
        "Hidden"
    }
}
print(conditional)  // ["Base","Extra"]

ビルダー内のループ

buildArrayはループ(for/map)の結果を集めるため、繰り返しの要素を自然に生成できます。

let items = ["a","b","c"]
let looped = lines {
    for x in items { x.uppercased() } // contributes ["A","B","C"]
}
print(looped)

単一値のビルダー

ビルダーは単一の値を出力することもできます。ここでは条件分岐を使いながら、各部分を1つの文字列に連結します。

@resultBuilder
struct TextBuilder {
    static func buildBlock(_ parts: String...) -> String {
        parts.joined(separator: " ")
    }
    static func buildEither(first: String) -> String { first }
    static func buildEither(second: String) -> String { second }
    static func buildArray(_ components: [String]) -> String {
        components.joined(separator: " ")
    }
}

func text(@TextBuilder _ content: () -> String) -> String { content() }

// Compose a small sentence with conditions
let loggedIn = false
let sentence = text {
    "[INFO]"
    "Welcome,"
    if loggedIn { "user!" } else { "guest." }
}
print(sentence) // "[INFO] Welcome, guest."

設計のヒント

ヒント:

  • DSLは最小限で、目的を絞ったものにしてください。
  • ビルダーで注釈を付ける、明確なエントリー関数を1つ用意してください。
  • 必要な機能だけをサポートしてください: buildBlock、buildEither、buildArray。
  • ブロック内で許可される文をドキュメント化してください。

Result Builder の目的

確認問題: Result Builder の主な利点は何ですか?

まとめ

まとめ: @resultBuilderのメソッドを定義して要素を結合し、小さなエントリーAPIを公開すると、if/forをサポートする読みやすいブロックを組み立てられます。

よくある質問

「result builderでミニDSLを構築する」レッスンは無料ですか?

はい。「result builderでミニDSLを構築する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「result builderでミニDSLを構築する」で何を学びますか?

@resultBuilder を使って小さなDSLを構築します。ビルダー関数を定義し、ブロックを組み合わせ、条件分岐やループにも対応して読みやすく構築できるようにします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「result builderでミニDSLを構築する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. result builderでミニDSLを構築する
  2. スコープ付きAPIと可読性のパターン
  3. UIフレームワークを使わない実践例
← Swift Academyに戻る