UserDefaultsとは
UserDefaultsはアプリの内部ストレージに簡易的なデータを保存しておき、アプリを終了したとしても再度立ち上げた際に取得して利用できるデータ保存機能です。
例えば、アプリの設定やセキュアではないログイン情報(ユーザー名、ユーザーID、性別等)を保存しておき、アプリを開く度にデータを参照できるようにするなどの利用方法があります。
UserDefaultsManagerクラスの実装
UserDefaultsの実装自体はとても簡単です。
今回は、関数を呼び出すとデータを取得・保存できるUserDefaultsManagerクラスを実装してみます。
import Foundation
// UserDefaultsに保存するデータの種類
enum UserDefaultsKey: String {
case name
case sounds
case light
}
// UserDefaultsクラス
class UserDefaultsManager {
// データの保存 引数には保存する内容と何のデータを保存するかのenumを渡します。
func save(value: Any?, for key: UserDefaultsKey) {
let defaults = UserDefaults.standard
// 保存する値の型によって処理を変える。
if let value = value {
switch value {
case is Int:
defaults.set(value as! Int, forKey: key.rawValue)
case is Float:
defaults.set(value as! Float, forKey: key.rawValue)
case is Double:
defaults.set(value as! Double, forKey: key.rawValue)
case is Bool:
defaults.set(value as! Bool, forKey: key.rawValue)
case is URL:
defaults.set(value as? URL, forKey: key.rawValue)
case is Data:
defaults.set(value as! Data, forKey: key.rawValue)
case is String:
defaults.set(value as! String, forKey: key.rawValue)
case is [Any]:
defaults.set(value as! [Any], forKey: key.rawValue)
case is [String: Any]:
defaults.set(value as! [String: Any], forKey: key.rawValue)
default:
// UserDefaultsにサポートされていない型の場合はエラーを投げるか、
// 例外的な処理を実行する
print("保存できない型が渡されました。")
}
} else {
defaults.removeObject(forKey: key.rawValue)
}
}
// データを取得する
// 取得するデータ型はAnyとしているので、取得した後にキャストする必要があります。
func retrieve(for key: UserDefaultsKey) -> Any? {
let defaults = UserDefaults.standard
return defaults.object(forKey: key.rawValue)
}
// データを削除する
func delete(for key: UserDefaultsKey) {
let defaults = UserDefaults.standard
defaults.removeObject(forKey: key.rawValue)
}
}
UserDefaultsに保存する内容はアプリによって固定であることが多いと思いますので、何のデータを取り扱うかはenumで管理します。
例えば、ユーザー名を保存したければkeyに.nameを渡すとUserDefaultsの”name”キーにデータが保存されます。
UserDefaultsはさまざまなデータ型を保存できますが、対応していない型もあり、その場合はdefaults:の中にエラー処理を書いてください。
使い方
let userName = "田中まさし"
// 保存
UserDefaultsManager().save(value: userName, for: .name)
// 取得(型確認が必要)
var name = ""
if let userName = UserDefaultsManager().retrieve(for: .name) as? String {
name = userName
}
// 削除
UserDefaultsManager().delete(for: .name)
コメント