FileBuilder

此包以声明式的方式生成文件和目录,使您可以专注于内容,而不是代表文件层次结构和创建文本文件所需的“簿记”工作。

提供了两个结果构建器:FileBuilderTextBuilder。使用它们来构建文件层次结构类似于使用 SwiftUI 来构建视图层次结构。

FileBuilder

FileBuilder 允许创建目录和文件。 这使得一个脚本可以创建正确的目录结构并在其中生成多个文件。

文件构建器接受要构建的 File 值列表。 提供了三种主要类型:

TextBuilder

TextBuilder 用于在 TextFile 中构建字符串。

示例

FileBuilderTextBuilder 利用了 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 个数据文件。

"Image showing a directory called Generated Files with 6 text files and 6 data files inside."

还可以定义 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 项目。

https://github.com/danielctull/FileBuilder

要在 Swift Package 中使用 FileBuilder,请将其添加到 Package.swift 中的 dependencies 子句中。

dependencies: [
  .package(url: "https://github.com/danielctull/FileBuilder", branch: "main")
]