UserDefault にフィールドやスイッチなどの設定情報を保存するとき、個々のデータをフラットに保存するのは簡単ですが、それぞれのデータを識別するキーがユニークでなければなりません。
しかし、シーンが多くあったりしてデータが多くなるとキーが多くなって煩雑になります。
配列で保存する方法も紹介されていますが、配列だと配列毎に順序を管理する必要があります。
そこで、クラス毎にUserDefault に保存するデータの辞書を作成してその辞書を1つのキーでUserDefault に保存してみました。
以下の例は playGround
で動作確認した例です。
例
// 何も無い状態をチェック
let myDefault = NSUserDefaults.standardUserDefaults()
if let readDict = myDefault.objectForKey("save") as? [String: String] {
let readData2 = readDict["key2"]!
} else {
println("No such Data")
}
// No such data!
// データを用意して保存
let saveData = ["key1": "data1", "key2": "data2", "key3": "data3"]
let saveDefault = NSUserDefaults.standardUserDefaults()
saveDefault.setObject(saveData, forKey: "save")
saveDefault.synchronize()
// 再度読み出し
if let readDict = myDefault.objectForKey("save") as? [String: String] {
let readData2: String! = readDict["key2"]
let readData3: String! = readDict["key3"]
let readData4: String! = readDict["key4"]
println("Data of key2 = (readData2)")
println("Data of key3 = (readData3)")
println("Data of key4 = (readData4)")
} else {
println("No such Data")
}
/*
Data of key2 = data2
Data of key3 = data3
Data of key4 = nil
*/
// 消去
saveDefault.removeObjectForKey("save")
saveDefault.synchronize()
辞書を保存するときに注意することは、辞書のデータを読み出すと、Optional型で読み出されることです。
また、Objective-C では辞書型のデータは型チェックはありませんが、Swift では辞書のデータは同じ型が基本ですので、全てString にしてから辞書にセットするなどの手間があります。
しかし、Defaultにアクセスするキーがデータの数にかかわらず1つでよいのがよい点です。