TextBuilder

CI status

简介

在 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