iOS アプリ等のクライアントアプリ開発で、こういうクラスがあると何かと便利かと思い。どの画面(Controller)からもインスタンスの取得ができ、自由にキーと値(値はどんな型でもよい)を保持しておくことができます。(ただ、もしかしてアンチパターンかも?)
手元の Swift のバージョンは
1.1
。Swift1.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 に変えればよいかと。