[iOS] Swiftでシングルトン singleton したい

2014/12/4

こんにちは。きんくまです。

Swiftでシングルトンしたいです。
調べてみるとhpiqueさんという方が以下に書かれてました

>> hpique/SwiftSingleton

Approach Bの入れ子のStructがおすすめとのこと。

ただ、ちょっとこの書き方がぱっと見よくわかんなかったので、もう少し分かりやすく書きたいと思いました。
(慣れてないだけかもしれないです、、)

まず、クラスプロパティを作りたいです。
すると、Swiftでは現段階では実装されてないことがわかりました。その対策として入れ子のStructを用意します。

>> Class variables not yet supported

入れ子のStructでクラスプロパティ

class Car{
    private struct SubStruct{
        static let MAX_SPEED:Int = 5
        static var numTires:Int = 4
    }
    
    class var MAX_SPEED:Int{
        return SubStruct.MAX_SPEED
    }
    class var numTires:Int{
        get{
            return SubStruct.numTires
        }
        set{
            SubStruct.numTires = newValue
        }
    }
}

println("speed = \(Car.MAX_SPEED)")

Car.MAX_SPEED = 10 //コンパイルエラー!

println("before: number of tires are \(Car.numTires)")

Car.numTires = 3

println("before: number of tires are \(Car.numTires)")

classプロパティの定数MAX_SPEEDを作ってみました。値を読み取ることは可能ですが、class varでsetを宣言していないため、値をsetしようとするとエラーが起こります。これでreadonlyにできました。

また、numTiresの方はstruct内はvarで宣言しつつ、get, setをclass varの方で宣言しているので、読み書き両方に対応しています。

これをふまえてシングルトンを書き直してみる

これをふまえてhpiqueさんの例を書き直してみると、こうなりました。

class SharedCar{
    private struct SubStruct{
        static let instance:SharedCar = SharedCar()
    }
    class var instance:SharedCar{
        return SubStruct.instance
    }
}

let sharedCar = SharedCar.instance

SharedCar.instance = SharedCar() //コンパイルエラー

この辺個人的な好みなのかもしれないのですが、自分としてはわかりやすくなったかなと。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る