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
编译器中。 它还处于早期开发阶段,但是 builder-macro
确实支持在支持的平台上使用它。
一旦您设置好了您的 Swift 包,添加 builder-macro
作为依赖项就像将其添加到您的 Package.swift
的 dependencies
值中一样简单。
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 文件。