シングルトンについて swift


はじめに

色々教えていただいたので書き直してみました!!ヽ(´▽`)/


ずばり!シングルトンとは!?

一言で言えば『いつでも同じものを使用したい時につかうもの』

正直、これだと『?????』ってなると思うので先生達から教えていただいたみじかな事例を踏まえてみていきましょう!!


みじかな事例の前に少しだけおさらい

let sample1 = Sample()

この記述はSampleクラスという設計書があるなら、その設計書をもとにSampleの実体を作った。

その実体をsample1という定数に保持している。

このことをSampleのインスタンス化という。

let sample1 = Sample()

let sample2 = Sample()

このように色々なところでインスタンス化できる。

しかし、これはあくまで設計書を元にSampleの実体を作っただけのもの

もし?あなたがsample1の値を変えたとしても、sample2はまた新しいものが作られて入れられる。

普通ならこれでもいいのだが、変更したその値を保持して欲しい、そう思った時、また値をリセットしてもらいたくない時、こう思うのではないか?

『うお〜〜〜〜〜〜〜〜!!変えたら新規作成なんてしないでくれよ!!』っと。

これだといまいちピント来ない方大丈夫です。

今回は色々な先生がこれ以外の方法でわかりやすく教えてくれます。

では先生たちにご登場いただきます!!:runner::runner_tone1::runner_tone2::runner_tone3::runner_tone4::runner_tone5:

なぜ同じ値が欲しいの?

そういう時ってあるのかな?

っと思う方いるかもしれないのですが、あるのです!

今回は、そこに視点を置いてます。

※先生の解説を自分で読みたいんだ!!っという方はコメント欄からお願いします!!


みじかな事例(こき使われるメイドです。) 先生: @lovee

あるメイドを作成して欲しいと頼んだ人がいる。

また違う日に頼むと、違ったメイドさんが作られる。

メイドを作成して欲しいと頼んだ人はこう言ったそうな。

『一回教えてるのにまた教えなきゃいけないなんて…。これからもこき使ってやるからいつもと同じメイドをよこせ!!』

参考画像

●普通のクラスのインスタンス化の場合

スクリーンショット 2019-06-16 19.03.55.png

●シングルトン使用の場合

スクリーンショット 2019-06-16 19.04.06.png

先生から一言

『シングルトンは同じものを呼べる特殊召喚術のようなものです』


みじかな事例(豚さん) 先生: @rotors123

※豚さんは豚さんでも今回は貯金箱の豚さんに変更させてもらってます。

みんなお金好きだから、きっとこっちのほうが……。あ、こんなこと言ったら嫌われる。

ある日豚さんの貯金箱を作って欲しいと少年が頼んだそうな。

少年はそこにお金を入れて貯金をしていた。

時間がたってからまた、貯金箱を作って欲しいと頼んだそうな。

来たのは貯金されていない最初頼んだものと同じ貯金箱だったそうな。

少年は思った。

『せっかく貯金したのに僕が貯金していた貯金箱をよこせよ!!』っと。

参考画像

●普通のクラスのインスタンス化の場合

スクリーンショット 2019-06-16 19.13.22.png

●シングルトン使用の場合

スクリーンショット 2019-06-16 19.13.30.png

先生から一言

『シングル(たった一つの)トン(豚)!!!!!』


みじかな事例(秘伝のタレ(とんこつ味)) 先生: @sunstripe2011

ある時親分から秘伝のタレを受け取った。

しかし秘伝のタレは、時代に合わせて変えないといけない。

そして秘伝のタレの味を変えていった。

ある時親分がきて秘伝のタレをまたくれた。

しかし僕は思った。

『この秘伝のタレが欲しいのではない。自分が味を変えた秘伝のタレが欲しいのだ』と

親分がこの僕の変えた秘伝のタレを持っていてくれたら…。

参考画像

●普通のクラスのインスタンス化の場合

スクリーンショット 2019-06-16 19.21.02.png

●シングルトン使用の場合

スクリーンショット 2019-06-16 19.21.08.png

先生から一言

『たった一つ(シングル)のとん(トン)こつ味の秘伝のたれ』

先生たちありがとうございました!!:clap::clap::clap::clap::clap::clap::clap:

ここまでくると普通のインスタン化とシングルトンの違いがなんとなくわかっていただけたのではないでしょうか?


codeで見る

ある程度わかってくるとコードもおさらいしたいと思うので参考コードを書かさせていただきます。


ViewController.swift

import UIKit

class Manager {
var memory:String = "記憶なし"

static let shared = Manager()
private init() {
}
}

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let manager = Manager.shared
print(manager.memory)
//記録なし

manager.memory = "メモリーの記録"

let newManager = Manager.shared
print(newManager.memory)
//メモリーの記録
}
}



最後に

先生たちありがとうございました。

記事の記述は少しニュアンスを変えているものもあります。

汚い言葉は記事を書いている人がそうしています。はい、わたしです。

先生方はとても優しく教えてくださっています。

先生の解説はコメント欄にあるので、直に先生たちの教えを請いたい場合はコメント欄からお願いします。

先生たち、みてくださっている方々たち、ニュアンスが違う、こう書いたほうがいいなどありましたら指摘お願いします:bow_tone1:


参考

http://qiita.com/codelynx/items/a936afe0a45d4cf5abfb



コメント欄