OKADA LABO

シングルトンとは

画面遷移をするとインスタンスが破棄されるという問題。
インスタンスのシングルトン設定で解決できる。

例えば
新規ツイートを投稿するためのViewControllerである、
「newTweetViewController」
と
そのツイートの一覧表示のためのViewControllerである、
「tweetTableViewController」
があるとして

新規ツイート投稿ページ(newTweetViewController)から、
ツイート一覧ページ(tweetTableViewController)へ遷移した際
画面遷移をするとツイートインスタンス(ツイート内容)が破棄される。

そうならないようにするためには
シングルトンを使う

シングルトンで宣言された変数は
つねに1個で扱われる。
どういうことかと言うと
シングルトンで宣言された変数は
インスタンスを生成するメソッド呼ばれるたびに
もとのその変数を参照し持ってくる。
簡単に言うと過去に作ったインスタンスをもってくる。
そして、新しいインスタンスを加えて再度保存する。
というような動きをする。
だから1個である。
これなら破棄されても、インスタンスは常に過去の内容ももってくるので問題ないわけだす。

記述ルールは
クラスにstaticをつけるだけ

使用例

TweetCollection.swift

static let sharedInstance = TweetCollection()

新規ツイート投稿(インスタンス生成)。
newTweetViewController.swift

let tweetCollection = TweetCollection.sharedInstance

//TweetCollection.swiftの TweetCollectionクラスにTweetを配列に追加するメソッド func addTweetCollection を実行するとして
self.tweetCollection.addTweetCollection(tweet: tweet)

ツイート(インスタンス)一覧に表示。
tweetTableViewController.swift

let tweetCollection = TweetCollection.sharedInstance
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    let tweet = self.tweetCollection.tweets[indexPath.row]
    cell.textLabel!.text = tweet.title
    return cell
}

という感じです。