onsen code monkey

個人的な日記とプログラミング備忘録です

【Swift】UserDefaultsでデータを保存する

f:id:hitoto28:20180702031448p:plain
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)
    }
}