Builder

Builder 是一个 Swift 构建器模式库,它以 dynamicCallable 和 dynamicMemberLookup 作为其核心。

codebeat badge build test SwiftPM Compatible Version License Platform

示例

要运行示例项目,请克隆该仓库,然后首先从 Example 目录运行 pod install

要求

安装

Cocoapods

Builder 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中

pod 'Builder', '~> 1.1.1'

XCode 中的 Swift Package Manager

从 Package.swift 使用 Swift Package Manager

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

有一个名为 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

有一个名为 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)")
}

贡献

您知道怎么做,只需克隆并进行拉取请求