はじめに
様々な形でのUserDefaultsへのデータの保存方法に関して説明します。
仕組み
UserDefaultsのデータは全てkey:value形式で保存されるようになっています。
そのためkeyを指定して保存、該当データを読み出したいときはkeyを指定して読み出しをします
保存と読み出し:Intの場合の例
保存
//インスタンス取得
let defaults = UserDefaults.standard
//key"Age"でUserDefaultに保存
defaults.set(25, forKey: "Age")
読み出し
//インスタンス取得
let defaults = UserDefaults.standard
//key"Age"でUserDefaultから取得
let age = defaults.integer(forKey: "Age")
UserDefaultsに保存できる型
何が保存できるかは決まっています。
①boolean、integer、float、double、string、array、dictionary、Data
②データ型がクラスの場合NSCodeingに準拠しているクラス(CodableでOK)
また、配列またはディクショナリの場合、全てのkeyとvalueが①②に適合している必要があります。
クラスのインスタンスを保存する場合
Codableに準拠したクラスを作成します。
class Person: NSObject,Codable {
var name:String
var age:String
init(name: String, age: String) {
self.name = name
self.age = age
}
}
保存
Data型で保存する必要があるため一度JSONEncoderでData型に変換し保存します。
var person = Person(name: "nona", age: "15")
func save(){
let jsonEncoder = JSONEncoder()
if let saveData = try? jsonEncoder.encode(person){
let defaults = UserDefaults.standard
defaults.set(saveData, forKey: "person")
}else{
print("Failed to save person")
}
}
読み出し
保存の逆でData型で読み出したものをdecodeして元のインスタンスに戻しています。
func load(){
var loadPerson:Person?
let defaults = UserDefaults.standard
if let savedPerson = defaults.object(forKey: "person") as? Data{
let jsonDecoder = JSONDecoder()
do{
loadPerson = try jsonDecoder.decode(Person.self, from: savedPerson)
//デバッグ用に出力しています
print("Name:\(loadPerson?.name),\(loadPerson?.age)")
}catch{
print("Failed to load people")
}
}
}
注意点
UserDefaultsはアプリ実行時にデータが読み込まれるので非常に簡単に使用できますが、アプリの読み込みが遅くなるため大量のデータを保存する場合は他の保存方法を検討すべきです。
まとめ
・UserDefaultsで簡単にデータの読み書きが可能になる
・データがアプリ実行時に読み込まれるので大量のデータには不向き
iOS開発のおすすめ書籍
あの実装方法どうだったっけ?を解決してくれます。swiftの文法から部品、ネットワーク、各種センサーなど端末機能の使い方まで対応しており、あると便利な一冊です。
コメント