构建自定义DSL:超越ViewBuilder的领域特定语言
从零实现一个类似ViewBuilder的ResultBuilder,支持条件分支、循环与自定义布局算法 · 难度:入门 · +10XP
构建自定义DSL:超越ViewBuilder的领域特定语言
SwiftUI的ViewBuilder本质上是ResultBuilder,本教程将创建一个LayoutBuilder,支持if-else、for-in以及自定义间距计算。并讲解如何通过buildExpression、buildBlock与buildOptional实现类似SwiftUI的声明式语法。
@resultBuilder
struct LayoutBuilder {
static func buildBlock<each Child: Layout>(_ children: repeat each Child) -> CombinedLayout {
CombinedLayout(children: repeat each child)
}
static func buildEither<T: Layout>(first: T) -> T { first }
static func buildEither<T: Layout>(second: T) -> T { second }
static func buildArray<T: Layout>(_ components: [T]) -> ArrayLayout {
ArrayLayout(children: components)
}
}
@LayoutBuilder func myLayout() -> some Layout {
if true { FixedLayout(width: 100) }
for _ in 0..<3 { FlexibleLayout() }
}