BuilderMacro is a macro that implements the Builder design pattern in Swift

builder-macro

License Swift Compatibility Platform Compatibility CodeCov CI GitHub release; latest by date

描述

builder-macro 是一个在 Swift 中实现 Builder 设计模式的宏。

用法

import BuilderMacro

@Builder
struct Person {
    let id: UUID
    let name: String
    let bday: Date
}

// Expanded

struct Person {
    let firstName: String, let lastName: String, let middleName: String
    let birthday: Date
    let city: String

    struct PersonBuilder {
        var firstName: String?
        var lastName: String?
        var middleName: String?
        var birthday: Date?
        var city: String?

        func firstName(_ firstName: String) -> Self {
            var copy = self
            copy.firstName = firstName
            return copy
        }

        func lastName(_ lastName: String) -> Self {
            var copy = self
            copy.lastName = lastName
            return copy
        }

        func middleName(_ middleName: String) -> Self {
            var copy = self
            copy.middleName = middleName
            return copy
        }

        func birthday(_ birthday: Date) -> Self {
            var copy = self
            copy.birthday = birthday
            return copy
        }

        func city(_ city: String) -> Self {
            var copy = self
            copy.city = city
            return copy
        }

        enum BuildError: Swift.Error {
            case missingRequiredField(description: String)
        }

        func build() throws -> Person {
            guard let firstName = firstName else {
                throw BuildError.missingRequiredField(description: "firstName")
            }

            guard let lastName = lastName else {
                throw BuildError.missingRequiredField(description: "lastName")
            }

            guard let middleName = middleName else {
                throw BuildError.missingRequiredField(description: "middleName")
            }

            guard let birthday = birthday else {
                throw BuildError.missingRequiredField(description: "birthday")
            }

            guard let city = city else {
                throw BuildError.missingRequiredField(description: "city")
            }

            return Person(
                firstName: firstName,
                lastName: lastName,
                middleName: middleName,
                birthday: birthday,
                city: city
            )
        }
    }
}

如果属性类型是可选类型,您可以通过将 addGuards 参数传递给 builder 宏来强制验证 nil 值,如下所示:

import BuilderMacro

@Builder(addGuards: true)
struct Person {
    let id: UUID
    let name: String
    let bday: Date
}

要求

安装

Swift 包管理器

Swift 包管理器是一个用于自动化 Swift 代码分发的工具,并且集成到了 swift 编译器中。 它还处于早期开发阶段,但是 builder-macro 确实支持在支持的平台上使用它。

一旦您设置好了您的 Swift 包,添加 builder-macro 作为依赖项就像将其添加到您的 Package.swiftdependencies 值中一样简单。

dependencies: [
    .package(url: "https://github.com/space-code/builder-macro.git", .upToNextMajor(from: "1.0.0"))
]

交流

贡献

启动开发环境

make bootstrap

请随意帮助改进这个项目! 如果您发现有什么可以改进的地方,或者想要一个新功能,请打开一个 issue 或发送一个 Pull Request!

作者

Nikita Vasilev, nv3212@gmail.com

许可证

builder-macro 基于 MIT 许可证发布。 更多信息请查看 LICENSE 文件。