在 SwiftUI 中,Text
的组合通常很繁琐,尤其是在存在影响其格式和内容的逻辑时。
TextBuilder 利用 Swift Result Builders(结果构建器) 的强大功能来解决这个问题。TextBuilder 模仿 SwiftUI 的 ViewBuilder,以便在使用时提供熟悉的体验。
TextBuilder 开箱即用地提供 3 种现成的构建器,具体取决于您需要的文本分隔符。
@TextBuilder
var loremIpsum: Text {
Text("Lorem").underline().foregroundColor(.blue)
Text("ipsum dolor")
Text("sit").bold()
Text("amet, consectetur")
}
@TextBuilderWithSpaces
var loremIpsum: Text {
Text("Lorem").underline().foregroundColor(.blue)
Text("ipsum dolor")
Text("sit").bold()
Text("amet, consectetur")
}
@TextBuilderWithNewlines
var loremIpsum: Text {
Text("Lorem").underline().foregroundColor(.blue)
Text("ipsum dolor")
Text("sit").bold()
Text("amet, consectetur")
}
TextBuilder 直接接受 String
类型,就像它们是纯 Text
一样,并且还提供了一个 String.text
计算属性,以在显式需要 Text
时消除不必要的代码冗余。
@TextBuilderWithNewlines
var loremIpsum: Text {
"Lorem".text.underline().foregroundColor(.blue)
"ipsum dolor"
"sit".text.bold()
"amet, consectetur"
}
有两种选择可以自定义用于组合 Text
的分隔符。
首先,您可以使用 Text.init(separator:content:)
var loremIpsum: Text {
Text(separator: " 🍆 ") {
"Lorem".text.underline().foregroundColor(.blue)
"ipsum dolor"
"sit".text.bold()
"amet, consectetur"
}
}
但是如果您更喜欢继续使用结果构建器,您可以
struct EggplantSeparator: TextBuilderSeparator {
static var separator: String? { " 🍆 " }
}
@TextBuilderWith<EggplantSeparator>
var loremIpsum: Text {
"Lorem".text.underline().foregroundColor(.blue)
"ipsum dolor"
"sit".text.bold()
"amet, consectetur"
}
MacBook Pro (14-inch, 2021)
Apple M1 Pro (10 cores, 8 performance and 2 efficiency)
32 GB Memory
$ swift run -c release Benchmarks
name time std iterations
------------------------------------------------
Result Builder 1875.000 ns ± 26.15 % 729940
Initializer 2542.000 ns ± 16.88 % 540826