不使用界面框架的实用示例
无需界面框架即可编写实用的小型 DSL:配置文件、简单查询构建器、文本/Markdown 生成器,以及使用 @resultBuilder 的验证流水线。
不使用界面框架的实用示例 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。
非用户界面结果构建器
除了用户界面之外,您还可以为许多任务构建实用的 DSL。我们将构建 config、查询、文本和验证构建器。让每个构建器都保持小型并专注于单一目标。
config 构建器
config 构建器会将简单的元组收集到字典中。调用位置整洁且易于浏览。
@resultBuilder
struct ConfigBuilder {
static func buildBlock(_ parts: (String,String)...) -> [String:String] {
var dict: [String:String] = [:]
for (k,v) in parts { dict[k] = v }
return dict
}
}
func config(@ConfigBuilder _ body: () -> [String:String]) -> [String:String] { body() }
// Use it:
let cfg = config {
("ENV", "debug")
("API_URL", "https://api.example.com")
("RETRY", "3")
}
print(cfg["API_URL"] ?? "missing")查询构建器
查询构建器会使用 AND 连接子句。我们通过构建器钩子支持 if/else 和循环。
struct Where { let clauses: [String] }
@resultBuilder
struct WhereBuilder {
static func buildBlock(_ parts: String...) -> Where { Where(clauses: parts) }
static func buildArray(_ parts: [String]) -> Where { Where(clauses: parts) }
static func buildEither(first: Where) -> Where { first }
static func buildEither(second: Where) -> Where { second }
}
func whereClauses(@WhereBuilder _ body: () -> Where) -> Where { body() }
func select(_ table: String, where w: Where) -> String {
let filter = w.clauses.isEmpty ? "" : " WHERE " + w.clauses.joined(separator: " AND ")
return "SELECT * FROM \(table)\(filter);"
}
// Use:
let isProd = false
let q = select("users", where: whereClauses {
"age > 18"
if isProd { "status = 'active'" } else { "status <> 'deleted'" }
})
print(q)文本/Markdown 构建器
文本构建器会输出单个 String。h2 和 bullet 等辅助函数让代码块更易读。
@resultBuilder
struct TextBuilder {
static func buildBlock(_ parts: String...) -> String { parts.joined(separator: "\n") }
static func buildEither(first: String) -> String { first }
static func buildEither(second: String) -> String { second }
static func buildArray(_ parts: [String]) -> String { parts.joined(separator: "\n") }
}
func md(@TextBuilder _ body: () -> String) -> String { body() }
func h2(_ s: String) -> String { "## " + s }
func bullet(_ s: String) -> String { "- " + s }
let doc = md {
h2("Release Notes")
bullet("Faster build")
bullet("Smaller binary")
}
print(doc)验证构建器
先收集验证规则,然后将它们作为流水线运行。代码块保持声明式;执行会在稍后进行。
struct ValidationResult { let ok: Bool; let messages: [String] }
typealias Rule = (String) -> String? // nil = OK; otherwise error message
@resultBuilder
struct RulesBuilder {
static func buildBlock(_ parts: Rule...) -> [Rule] { parts }
static func buildArray(_ parts: [[Rule]]) -> [Rule] { parts.flatMap { $0 } }
}
func rules(@RulesBuilder _ body: () -> [Rule]) -> [Rule] { body() }
func validate(_ input: String, with rules: [Rule]) -> ValidationResult {
var msgs: [String] = []
for r in rules { if let m = r(input) { msgs.append(m) } }
return ValidationResult(ok: msgs.isEmpty, messages: msgs)
}
// Use:
let rs = rules {
{ $0.isEmpty ? "Must not be empty" : nil }
{ $0.count < 3 ? "Too short" : nil }
}
let out = validate("hi", with: rs)
print(out.ok, out.messages)设计建议
提示:
- 从 buildBlock 开始;仅在需要时添加 either/array。
- 让输出类型保持简单:String、数组和小型结构体。
- 为每个 DSL 提供一个入口函数(例如 config、md)。
- 记录允许使用的语句和转义规则。
非用户界面构建器使用场景
快速检查:选择一个可靠的非用户界面构建器用途:
回顾
回顾:结果构建器非常适合结构化输入——配置、查询、文本和验证。让它们保持最小化、易读且作用域清晰。
常见问题解答
「不使用界面框架的实用示例」课时是免费的吗?
是的 — 「不使用界面框架的实用示例」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。
「不使用界面框架的实用示例」这节课中我会学到什么?
无需界面框架即可编写实用的小型 DSL:配置文件、简单查询构建器、文本/Markdown 生成器,以及使用 @resultBuilder 的验证流水线。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。
「不使用界面框架的实用示例」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 result builders 构建小型 DSL
- 作用域 API 与可读性模式
- 不使用界面框架的实用示例