m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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が絡むので注意が必要

所感

共通メソッドはともかく、共通変数を使用するのはちょっとややこしいので注意が必要。