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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- result builderでミニDSLを構築する
- スコープ付きAPIと可読性のパターン
- UIフレームワークを使わない実践例