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へ文字列を保存する
let userDefaults = UserDefaults.standard
userDefaults.set("aiueo", forKey: "sample")
userDefaults.synchronize()
UserDefaultsから文字列を取り出す
let userDefaults = UserDefaults.standard
if let value = userDefaults.string(forKey: "sample") {
print(value)
}
サンプルコード② UserDefaultsのデータを削除
UserDefaultsから文字列を削除する
let userDefaults = UserDefaults.standard
userDefaults.removeObject(forKey: "sample")
userDefaults.synchronize()
UserDefaultsのデータを一括削除する
let userDefaults = UserDefaults.standard
if let domain = Bundle.main.bundleIdentifier {
userDefaults.removePersistentDomain(forName: domain)
}
userDefaults.synchronize()
サンプルコード③ 独自クラスの保存と呼び出し
独自クラスの宣言
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
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)
}
}