【Swift】UserDefaultsでデータを保存する
iOSでデータを永続的に保存する方法は数多あれど、最もお手軽かつ高速な方法と言えばUserDefaults。
大量のデータや機密データを扱う場合は大人しくDB等を使うべし。
UserDefaultsの特徴
- key=valueでデータを保存することができる
- 学習コストが低い
- 少量のデータ保存に向いている
- 機密性が高いデータの保存には向いていない
- 保存したデータはアプリ内部にplist形式(XML)で保存される
UserDefaultsで保存できる型と使用するメソッド
対象の型 | 保存時の処理 | 参照時の処理 |
---|---|---|
配列型 [Any] |
set:forKey: | array:forKey: |
真偽型 Bool |
set:forKey: | bool:forKey: |
データ型 Data |
set:forKey: | data:forKey: |
辞書型 [String: Any] |
set:forKey: | dictionary:forKey: |
浮動小数点数型 Float |
set:forKey: | float:forKey: |
整数型 Int |
set:forKey: | integer:forKey: |
オブジェクト型 Any |
set:forKey: | object:forKey: |
文字列型配列 [String] |
set:forKey: | stringArray:forKey: |
文字列型 String |
set:forKey: | string:forKey: |
倍精度浮動小数点数型 Double |
set:forKey: | double:forKey: |
URL型 URL |
set:forKey: | url:forKey: |
サンプルコード① 文字列の読み書き
UserDefaultsへ文字列を保存する
// UserDefaultsの参照 let userDefaults = UserDefaults.standard // sampleというキーで値「aiueo」を保存する userDefaults.set("aiueo", forKey: "sample") // UserDefaultsへの値の保存を明示的に行う userDefaults.synchronize()
UserDefaultsから文字列を取り出す
// UserDefaultsの参照 let userDefaults = UserDefaults.standard // sampleというキーを指定して保存していたString型の値を取り出す if let value = userDefaults.string(forKey: "sample") { print(value) }
サンプルコード② UserDefaultsのデータを削除
UserDefaultsから文字列を削除する
// UserDefaultsの参照 let userDefaults = UserDefaults.standard // sampleというキーを指定して保存していた値を削除する userDefaults.removeObject(forKey: "sample") userDefaults.synchronize()
UserDefaultsのデータを一括削除する
// UserDefaultsの参照 let userDefaults = UserDefaults.standard // 一括削除 if let domain = Bundle.main.bundleIdentifier { userDefaults.removePersistentDomain(forName: domain) } userDefaults.synchronize()
サンプルコード③ 独自クラスの保存と呼び出し
独自クラスの宣言
// 独自クラスをシリアライズする際には、NSObjectを継承し // NSCodingプロトコルに準拠する必要がある class SampleData: NSObject,NSCoding { var data1: String? var data2: Bool = false override init() { } // デシリアライズ処理(デコード処理とも呼ばれる) required init?(coder aDecoder: NSCoder) { data1 = aDecoder.decodeObject(forKey: "data1") as? String data2 = aDecoder.decodeBool(forKey: "data2") } // シリアライズ処理(エンコード処理とも呼ばれる) func encode(with aCoder: NSCoder) { aCoder.encode(data1, forKey: "data1") aCoder.encode(data2, forKey: "data2") } }
UserDefaultsへの保存と呼び出し処理
// 独自クラスのインスタンスに値を格納 let sampleData = SampleData() sampleData.data1 = "hello" sampleData.data2 = true // UserDefaultsの参照 let userDefaults = UserDefaults.standard // シリアライズ処理 let archiveData = NSKeyedArchiver.archivedData(withRootObject: sampleData) userDefaults.set(archiveData, forKey: "sample") userDefaults.synchronize() // デシリアライズ処理 if let storedData = userDefaults.object(forKey: "sample") as? Data { if let unarchivedData = NSKeyedUnarchiver.unarchiveObject(with: storedData) as? SampleData { if let data1 = unarchivedData.data1 { print(data1) } print(unarchivedData.data2) } }