2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ~Builder~

Last updated at Posted at 2020-01-13

この記事シリーズは、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()
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?