Builder 是一个 Swift 构建器模式库,它以 dynamicCallable 和 dynamicMemberLookup 作为其核心。
要运行示例项目,请克隆该仓库,然后首先从 Example 目录运行 pod install
。
Builder 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中
pod 'Builder', '~> 1.1.1'
在 Package.swift 中将其添加为您的目标依赖项
dependencies: [
.package(url: "https://github.com/hainayanda/Builder.git", .upToNextMajor(from: "1.1.1"))
]
在您的目标中将其用作 Builder
.target(
name: "MyModule",
dependencies: ["Builder"]
)
Nayanda Haberty, hainayanda@outlook.com
Impose 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。
使用 Builder 很简单。 您只需要传递您想要构建的对象,并将其可写属性分配为函数。 例如
如果您有这样的类
class MyObject {
var string: String?
var int: Int?
var double: Double?
...
...
}
您可以像这样构建它
let myObject: MyObject = builder(MyObject())
.string("some string")
.int(10)
.double(1.2)
.build()
它甚至可以分配属性的属性,只要属性是可变的,就可以分配到您需要的深度
let myObject: MyObject = builder(MyObject())
.string("some string")
.int(10)
.double(1.2)
.subObject.string("some string")
.subObject.int(10)
.subObject.double(1.2)
.build()
有一个名为 Buildable 的协议,允许您的对象拥有一个 bld
计算属性,该属性将返回一个 Builder 对象供您使用
let myObject: MyObject = MyBuildable().bld
.string("some string")
.int(10)
.double(1.2)
.subObject.string("some string")
.subObject.int(10)
.subObject.double(1.2)
.build()
有一个名为 Initializable 的协议,声明如下
public protocol Initializable {
init()
}
它只是为了确保您可以通过仅传递其 Type
来调用构建器全局函数
let view: MyObjectImplementInitializable = builder(MyObjectImplementInitializable.self)
.string("some string")
.int(10)
.double(1.2)
.build()
Initializable 默认实现 Buildable
有时您可能会错误地尝试分配不可变的属性。 默认情况下,您总是可以看到这样的 debugPrint 输出
Failed to assign property keypath of MyType with property type MyPropertyType because its not writable
但是它可能会被遗忘并在将来成为一个错误。 因此,如果发生类似的事情,您始终可以强制它抛出 fatalError,方法是在 BuilderConfig
上分配 errorHandling
BuilderConfig.errorHandling = .fatalErrorOnAssigningLet
当分配不可变属性时,它将创建一个致命错误,因此您可以始终在它成为问题之前修复它。 您始终可以通过分配闭包来手动处理它
BuilderConfig.errorHandling = .manual { message in
debugPrint("FIX THIS: \(message)")
}
您知道怎么做,只需克隆并进行拉取请求