swiftの学習(シングルトンパターンっぽいもの)
シングルトンパターン
classの中でclassを共有するやりかた。
データベースなどのclassを使用する場合はよく使われると思われる。
サンプル
main
// // main.swift // import Foundation var _obj1 = Hoge.getInstance _obj1.name = "1111" _obj1.age = 100 var _obj2 = Hoge.getInstance _obj2.name = "22222" _obj2.age = 9999 println("name=\(_obj1.name), age=\(_obj1.age)") println("name=\(_obj2.name), age=\(_obj2.age)")
Hoge.class.swift
// // Hoge.class.swift // import Foundation class Hoge{ // プロパティ private var _name:String = "" internal var name:String{ get{ return _name } set(newValue){ _name = newValue } } // プロパティ private var _age:Int = 0 internal var age:Int{ get{ return _age } set(newValue){ _age = newValue } } // 初期化 private init(){ println("Hoge init") } // 共通インスタンス取得 class var getInstance :Hoge { println("getInstance !") struct Static{ static let instance = Hoge() } return Static.instance } }
※混乱するけどclassの中でclassを一部定義するのか・・・
結果
getInstance ! Hoge init getInstance ! name=22222, age=9999 name=22222, age=9999
※2回めの値の方を上書きしている
共通メソッドとかの定義
基本classの中にclassをつけた変数や関数が共通データになるよう
class変数の定義やclassメソッドの宣言
Foo.class.swift
class Foo { // class変数用定義 private struct ClassProperty { static var data = "" } // class変数用プロパティ class var data: String { get { return ClassProperty.data } set { ClassProperty.data = newValue } } // classメソッド class func test1(){ println(ClassProperty.data) } }
※class変数の場合はstructとstaticが絡むので注意が必要
所感
共通メソッドはともかく、共通変数を使用するのはちょっとややこしいので注意が必要。