Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
277
Help us understand the problem. What is going on with this article?
@susieyy

Swiftでシングルトンパターンを実装する3つの方法

More than 5 years have passed since last update.

How_to_design_Singleton_Pattern_using_Java____So_Many_Word.jpg

Swiftでシングルトンパターンを実装する方法はいくつかあるのでまとめました。

遅延初期化(lazy initialization)とスレッドセーフ(thread safety)を考慮された実装です。
遅延初期化はシングルトンのインスタンスを利用開始するまで当該インスタンスを生成しないことです。
スレッドセーフは複数のスレッドで同時にインスタンスの生成を試みても、誤って複数のインスタンスを生成しないことです。

この実装は以下のバージョンで確認しています。

  • Xcode6 Beta3

structのstatic定数で定義 (推奨)

static定数に初期化したインスタンスを保持する実装です。ただSwiftのclassstatic定数を利用できないので、structでネストしてstatic定数を保持しています。現状この実装方法が一番良いと言われています。

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}

グローバル定数で定義

グローバル定数に初期化したインスタンスを保持する実装です。グローバルに変数を保持するのは汚染と言われ推奨されませんが、今後Swiftの言語仕様が変更され局所的グローバル変数が定義できるようになれば、この実装方法がもっともシンプルになります。

let _SingletonSharedInstance = Singleton()

class Singleton  {
    class var sharedInstance : Singleton {
        return _SingletonSharedInstance
    }
}

dispatch_onceで実装

ObjCと同様の実装方法です。毎回これを書くにのは大変ですね。

class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

参考

277
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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
susieyy
フリーランス - スタートアップエンジニアリングアドバイザー - iOS技術顧問 - プロトタイプ開発

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
277
Help us understand the problem. What is going on with this article?