此包以声明式的方式生成文件和目录,使您可以专注于内容,而不是代表文件层次结构和创建文本文件所需的“簿记”工作。
提供了两个结果构建器:FileBuilder
和 TextBuilder
。使用它们来构建文件层次结构类似于使用 SwiftUI 来构建视图层次结构。
FileBuilder
允许创建目录和文件。 这使得一个脚本可以创建正确的目录结构并在其中生成多个文件。
文件构建器接受要构建的 File
值列表。 提供了三种主要类型:
Directory
:定义目录及其内容。DataFile
:使用数据创建新文件。TextFile
:创建新的文本文件,其内容由 TextBuilder
生成。TextBuilder
用于在 TextFile
中构建字符串。
FileBuilder
和 TextBuilder
利用了 swift 结果构建器提供的所有优点,允许内联 for 循环和 if 语句来构建文件目录和文本文件。
以下代码在给定的父目录中创建一个名为“Generated Files”的目录。 然后,为 1 到 10 的每个数字创建一个文本文件,并为数字 3、6 和 9 创建一个数据文件。 文本文件的内容取决于数字是偶数还是奇数。
func generate(in url: URL) throws {
try Directory("Generated Files") {
for i in (1...10) {
TextFile("Number \(i).txt") {
if i.isMultiple(of: 2) {
"This file is even-numbered."
} else {
"This is an odd-numbered file."
}
}
if i.isMultiple(of: 3) {
DataFile("Number \(i).data", data: Data())
}
}
}
.write(in: url)
}
以下显示了 Finder,其中包含一个“Generated Files”目录,其中包含 10 个文本文件和 3 个数据文件。
还可以定义 File
实现,以允许提取逻辑并更轻松地处理大量生成。 以下代码等效于上面的代码,只不过文本文件和数据文件被分解为它们自己的类型。
struct EvenOddTextFile: File {
let number: Int
var body: some File {
TextFile("Number \(number).txt") {
if number.isMultiple(of: 2) {
"This file is even-numbered."
} else {
"This is an odd-numbered file."
}
}
}
}
struct MultipleOfThreeDataFile: File {
let number: Int
var body: some File {
if number.isMultiple(of: 3) {
DataFile("Number \(i).data", data: Data())
}
}
}
func generate(in url: URL) throws {
try Directory("Generated Files") {
for i in (1...10) {
EvenOddTextFile(number: i)
MultipleOfThreeDataFile(number: i)
}
}
.write(in: url)
}
您可以将 FileBuilder 作为包依赖项添加到 Xcode 项目。
要在 Swift Package 中使用 FileBuilder,请将其添加到 Package.swift 中的 dependencies 子句中。
dependencies: [
.package(url: "https://github.com/danielctull/FileBuilder", branch: "main")
]