若干需要があったので、テンプレートファイルを作成して、Sourceryを使ってBuilderを自動生成してみました。
実装は、Lombokの@Builder
のようなシンプルなBuilderのイメージです。
テンプレートと使い方
作成したテンプレートは、ここに置いてあります。
// sourcery: Builder struct Params { let id: String? let name: String? let age: Int? let url: URL? var profile: String { return name ?? "" } }
上の元々の構造体(Params
)から、sourcery
を実行することで、
extension Params { static var builder: Builder { return Builder() } final class Builder { private var id: String? private var name: String? private var age: Int? private var url: URL? func id(_ id: String?) -> Builder { self.id = id return self } func name(_ name: String?) -> Builder { self.name = name return self } func age(_ age: Int?) -> Builder { self.age = age return self } func url(_ url: URL?) -> Builder { self.url = url return self } func build() -> Params { return Params(id: id, name: name, age: age, url: url) } } }
このようなコードが自動生成されます。
これにより、以下のようにインスタンスを生成できます。
let hoge = Params.builder .id("hoge") .name("hoge taro") .build()