Help us understand the problem. What is going on with this article?

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

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

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

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

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

Singletonとは?

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

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

デザインパターンです。

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

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

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

作ったもの

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

スクリーンショット 2017-07-02 15.53.27.pngスクリーンショット 2017-07-02 15.53.59.png

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()
}

完成

スクリーンショット 2017-07-02 15.57.22.pngスクリーンショット 2017-07-02 15.57.32.png

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

今回の実装内容

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away