3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UserDefault に辞書を保存する

Last updated at Posted at 2014-12-22

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つでよいのがよい点です。

3
5
0

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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?