Swift で Singleton パターンを実装する (Swift 1.2 対応)

Swift で Singleton (シングルトン) パターンを実装する方法はいくつか提案されていますが, ここでは Swift 1.2 以降で利用できる方法と Xcode 6 Beta 4 から利用出来る古い方法の2つを紹介します.

Xcode 6.3 / Swift 1.2 以降

コード

class SingletonSampleClass {
    private init() {
        // Initialization here
    }
    
    static let sharedInstance = SingletonSampleClass()
}

説明

    private init() {
        // Initialization here
    }

イニシャライザは private にしておき, sharedInstance 経由でのアクセスを強制します. ただし Swift の private のスコープは同じファイル内となるので, 同じファイル内からはイニシャライザを呼び出せてしまうことに注意する必要があります.

    static let sharedInstance = SingletonSampleClass()

Swift 1.2 からクラス内に let で定数を宣言することが可能になりました. また Swift の仕様により static 変数である singletonInstance は, 最初に参照された時に SingletonSampleClass のインスタンスが作成されます.

Xcode 6 Beta 4 以降

古い情報ですが, Xcode 6 Beta 4 から導入された Access Control とグローバル変数の遅延初期化を用いた方法を紹介します.

コード

private let singletonInstance = SingletonSampleClass()

class SingletonSampleClass {
    private init() {
        // Initialization here
    }

    class var sharedInstance: SingletonSampleClass {
        return singletonInstance
    }
}

説明

private let singletonInstance = SingletonSampleClass()

Singleton のインスタンスを保持する定数を宣言し, インスタンスを作成し保持します. Xcode 6 Beta 4 から導入された private が付加されているため外部からはアクセスできません. また Swift の仕様により, singletonInstance が最初に参照された時に, SingletonSampleClass のインスタンスが作成されます.

    private init() {
        // Initialization here
    }

イニシャライザは private にしておき, sharedInstance 経由でのアクセスを強制します.

    class var sharedInstance: SingletonSampleClass {
        return singletonInstance
    }

sharedInstance というプロパティを Read-Only Computed Property として定義します. このプロパティが上で作成したインスタンスを返すようにします. class を付加しているのでこれは Type Property となります.

参考

更新

  • 2014/8/25 init について追記
  • 2015/4/10 Swift 1.2 対応