この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
ごく普通のiOSアプリ開発でよくある状況や
Swiftのコアライブラリやフレームワークで使われているパターンに
着目してデザインパターンを学び直してみた記録です。
関連記事一覧
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン
Builderパターン概要
- 「段階的に設定すべき複数の構成要素」を持つ複雑なオブジェクトを生成するために使用されます。
- すなわち、オブジェクトを生成するための「お作法」を簡単にするパターンです。
- GoFのデザインパターンでは生成に関するパターンに分類されます。
使い所
- 例えば、UIAlertController は「段階的に設定すべき複数の構成要素」を持つオブジェクトです。Builderパターンによって扱いやすくすることができます。
サンプルコード
Swiftバージョンは 5.1 です。
extension UIAlertController {
typealias Block = (() -> Void)?
class Builder {
private var alert: UIAlertController = UIAlertController(title: "",
message: "",
preferredStyle: .alert)
convenience init(title: String?, message: String) {
self.init()
if let title = title {
alert.title = title
}
alert.message = message
}
@discardableResult
func addOkAction(completion: Block = nil) -> Self {
return addAction(title: "OK", completion: completion)
}
@discardableResult
func addCancelAction(completion: Block = nil) -> Self {
return addAction(title: "Cancel", style: .cancel, completion: completion)
}
@discardableResult
func addAction(title: String, style: UIAlertAction.Style = .default, completion: Block = nil) -> Self {
let action = UIAlertAction(title: title, style: style) { _ in
completion?()
}
alert.addAction(action)
return self
}
func show(completion: (() -> Void)? = nil) {
DispatchQueue.main.async {
guard
let keyWindow = UIApplication.shared.windows.filter({$0.isKeyWindow}).first,
let rootViewController = keyWindow.rootViewController
else {
return
}
rootViewController.present(self.alert, animated: true, completion: completion)
}
}
}
}
// Usage
UIAlertController.Builder(title: "TITLE", message: "MESSAGE")
.addCancelAction()
.addOkAction(completion: {
print("OK tapped")
})
.show()