こんにちは。きんくまです。
Swiftでシングルトンしたいです。
調べてみるとhpiqueさんという方が以下に書かれてました
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() //コンパイルエラー
この辺個人的な好みなのかもしれないのですが、自分としてはわかりやすくなったかなと。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ