0Pricing
Swift Academy · 课时

使用 result builders 构建小型 DSL

使用 @resultBuilder 构建小型 DSL:定义构建器函数、组合代码块,并支持条件与循环,让构造过程更易读。

使用 result builders 构建小型 DSL 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。

为什么使用结果构建器?

目标:使用 @resultBuilder 将易读的代码块转换为值。您定义各项的组合方式,而调用点保持简洁且声明式。

一个小型构建器

我们声明 buildBlock 来连接各项,并公开一个接口(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)

单值构建器

构建器也可以输出单个值。这里我们将各个部分连接成一个字符串,同时仍然使用条件语句。

@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 保持最小化并专注于单一目标。
  • 提供一个清晰的入口函数,并使用您的构建器进行注解。
  • 只支持所需的功能:buildBlock、buildEither、buildArray。
  • 记录代码块中允许使用哪些语句。

结果构建器的用途

快速检查:结果构建器的主要优势是什么?

回顾

回顾:定义 @resultBuilder 方法来组合片段,公开一个小型入口接口,并支持使用 if/for 组合易读的代码块。

常见问题解答

「使用 result builders 构建小型 DSL」课时是免费的吗?

是的 — 「使用 result builders 构建小型 DSL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。

「使用 result builders 构建小型 DSL」这节课中我会学到什么?

使用 @resultBuilder 构建小型 DSL:定义构建器函数、组合代码块,并支持条件与循环,让构造过程更易读。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「使用 result builders 构建小型 DSL」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 result builders 构建小型 DSL
  2. 作用域 API 与可读性模式
  3. 不使用界面框架的实用示例
← 返回 Swift Academy