Swift4でのSingletonを用いた共通データの値渡し


Swift4でのSingletonを用いた共通データの値渡し

今回デザインパターンの1つであるSingletonを勉強したいと思いまとめてみると共に、
簡単なデータ受け渡しのアプリを作ってみました。

別画面間でのデータの受け渡しや共通データを扱う際に便利なものになります

せっかくなので今回はSwift4での環境でアプリを作成しました(ほぼ今までと変わりませんが・・

Singletonとは?

まずは概要。
ググればすぐに出てきますが、簡単に言うと、

「そのクラスのインスタンスが1つしか生成されないことを保証する」

デザインパターンです。

  • Singletonクラスは、staticなSingletonクラスのインスタンスを1つ持つ
  • pointとしてはinitをprivateにすること

(後半に記述するがswift4ではoverrideしないといけない?)
ご指摘があった通り、関係ありませんでした。

※実装を見てもらえばわかりますが、親クラスがinit()を実装している場合はoverrideしないとエラーになります。

作ったもの

textFieldとTextViewにそれぞれテキストを入れて、
別画面においても保存したデータを読み込んだり更新できるような簡易アプリを作成しました

Singletonの作成

大事な部分

swift3だとoverrideいらないのにswift4環境だと必須になったみたいです

static let sharedInstance: Singleton = Singleton()
private override init() {}
Singleton.swift
import Foundation

class Data {
    var title: String
    var contents: String

    init(title: String, contents: String) {
        self.title = title
        self.contents = contents
    }

}

class Singleton: NSObject {
    var data = Data(title: "", contents: "")

    static let sharedInstance: Singleton = Singleton()
    private override init() {}
}

オブジェクト生成

ViewController.swift
let singleton :Singleton =  Singleton.sharedInstance

値の設定

viewcontroller側でデータに変更などがあった時に用いる

Singleton.swift
func saveTitle(title: String) {
    data.title = title
}

func saveContents(content: String) {
    data.contents = content
}
ViewController.swift
@IBAction func tappedButton(_ sender: UIButton) {
    guard
        let title = textField.text,
        let content = textView.text else { return }

    singleton.saveTitle(title: title)
    singleton.saveContents(content: content)
}

値の呼び出し

設定したデータを呼び出す際に用いる

プロパティにアクセスするといよりはクラスメソッドを呼び出すイメージです。

Singleton.swift
func getTitle() -> String {
    return data.title
}

func getContents() -> String {
    return data.contents
}
ViewController.swift
@IBAction func tappedLoad(_ sender: UIButton) {
    textField.text = singleton.getTitle()
    textView.text = singleton.getContents()
}

完成

無事別画面においても入力したテキストの内容を渡すことができました。
まぁこの程度なら遷移の際に渡せば十分ですが、実際にアプリを作る際に扱うデータはこんなに少なくないですし、
Singletonがインスタンスを保証してくれているので管理も楽ですね。

今回の実装内容

こちらにあります
https://github.com/mcz9mm/Singleton/tree/master