LoginSignup
4
4

More than 5 years have passed since last update.

[Swift] 任意のキーとオブジェクトを保持するシングルトンインスタンス

Posted at

iOS アプリ等のクライアントアプリ開発で、こういうクラスがあると何かと便利かと思い。どの画面(Controller)からもインスタンスの取得ができ、自由にキーと値(値はどんな型でもよい)を保持しておくことができます。(ただ、もしかしてアンチパターンかも?)

手元の Swift のバージョンは 1.1。Swift 1.2 以降であれば、クラスにアクセス修飾子(private) や static が利用できるらしいので、より良く書けるかも。

class SomeKeyValueManager {

  // データ保持用のDictionary(Key と Value の配列)
  var showcase = Dictionary<String, Any>()

  // 本クラスのインスタンスを返す(シングルトン)
  class func getInstance() -> SomeKeyValueManager {
    struct Static {
      static let instance = SomeKeyValueManager()
    }
    return Static.instance
  }

  // Key と Value の登録
  func register(#key: String, #value: Any) {
    showcase[key] = value
  }

  // Key(と Value)の解除
  func unregister(#key: String) {
    showcase[key] = nil
  }

  // 特定の Key に対する Value を返す(Optional型)
  func get(#key: String) -> Any? {
    if let value = showcase[key] {
      return value
    } else {
      return nil
    }
  }

  // 登録されている Key と Value の組を全て返す
  func get() -> Dictionary<String, Any> {
    return showcase
  }

  // 登録数を返す
  func count() -> Int {
    return showcase.count
  }
}

利用例

// インスタンスを取得
let manager = SomeKeyValueManager.getInstance()

// 任意の Key と Value を登録
manager.register(key: "key1", value: "someString")
manager.register(key: "key2", value: 99)

// 一件取得
if let item = manager.get(key: "key1") {
  println(item) // => someString
}

// 全件取得
for (key, value) in manager.get() {
  println("key: \(key), value: \(value)") // => key: key1, value: someString
                                          // => key: key2, value: 99
}

// 件数
println(manager.count()) // => 2

補足

もし Key が任意の文字列で気持ち悪い場合は Enum にすればよいかと。同様に、Value を絞りたければ Any を具体的な型へ変更すればよいかと思います。

またもし Key が不要で、値だけどんどん登録したい場合は Dictionary を辞めて Array に変えればよいかと。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4