iOS開発メモ11 (Core Dataの簡易版UserDefaults)

データベースを使うほどでもないが、永続化したいデータがある場合、UserDefaultsという便利なクラスがあった。(知っていれば、Core Dataには踏み込まなかった気がする)

UserDefaults - Foundation | Apple Developer Documentation

このクラスを使って、データをセットすれば、内部で永続データを作成して保存してくれる。基本的には、ローカル端末のアプリケーションごとのデータになるが、globalDomainやらドメインのプロパティがあるので、アプリケーション共通のデータなどもできそうだが、ここでは深く追求しない。

UserDefaultsインスタンスの取得

staticなstandardプロパティを使って、どこからでもアクセスできる。

let defaults:UserDefaults = UserDefaults.standard

データの設定

UserDefaultsは、ディクショナリのような形式でキーと値をセットで管理する。
第1引数にセットしたいデータを代入し、forKeyにキーとなる文字列を設定する。

セットできるデータ型は、リファレンスでは、NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionaryが保存可能らしい。基本型は全てOKだと思っても良さそう。

userDefaults.set( 999, forKey: "Key1" )
userDefaults.set( 0.0023, forKey: "key2" )
userDefaults.set( "hello", forKey: "Key3" )
userDefaults.set( [ "a", "b", "c" ], forKey: "Key4" )
userDefaults.set( [ "k1" : 0, "k2" : 1, "k3" : -2 ], forKey: "Key5")

どうも、userDefaullts.set()すると、すぐに永続データとして保存されて、アプリケーション再起動後もこの値が参照できる。Core Dataのcontent.save()に相当するようなコミットするAPIはなさそう?

あと、DictionaryやArrayの要素を変更したい場合、取得したArrayやDictionaryの要素を変更したら、丸ごと詰めなおしてデータを更新する。

データの取得

各データ型ごとに取得メソッドがある。下記以外にもサポートしている型ごとにメソッドがある。

let val = userDefaults.integer( forKey: "Key1" )
let val2 = userDefaults.double( forKey: "Key2" )
let val3 = userDefaults.string( forKey: "Key3" )
let array = userDefaults.array( forKey: "Key4" ) as! [String] // stringArray(forKey:)もあり
let dic = userDefaults.dictionary( forKey: "Key5" )

// dump
for( key, value ) in UserDefaults.standard.dictionaryRepresentation() {
    print("\(key) = \(value)")
}

そのほか

まったく試してないが、didChangeNotificationなどは、データが変更されたときのイベント関数っぽい。あとは、ドメイン関連の設定メソッドがたくさんある。どんなことまでできるかはよく分かってない。

非常にお手軽にデータの出し入れが可能なので、アプリケーションの設定画面の値などの保存に使えそうである。