【Swift】UserDefaultsの使い方

アプリ内にデータを保存するUserDefaultsの使い方を解説します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】11.5
【Swift】5.2.4
【iOS】13.5
【macOS】Catalina バージョン 10.15.5
スポンサーリンク

UserDefaultsとは?

UserDefaultsは、アプリ内にデータを保存する仕組みです。
アプリの設定やユーザー設定などの軽量データを扱う操作を想定した仕組みで、大量のデータを扱うには不向きです。
アプリを終了してもデータは消えませんが、アプリを削除するとデータも消えてしまいますので、重要なデータをUserDefaultsのみに持たせるのは控えたほうがいいでしょう。

スポンサーリンク

基本的な使い方

操作の基本は標準UserDefaultsオブジェクト(userDefaults.standard)のインスタンスメソッドで操作します。
データはキーと値のペアで保存します。
キーは常に文字列で、保存できる値は次のいずれかのデータ型になります。
Data、String、Number(Int、Float、Double)、Date、Array、Dictionary、Bool

保存(追加・更新)

保存にはset(_:forKey:)メソッドを使います。
値の型に応じてオーバーロードメソッドが呼ばれます。
同じキーで更新すると前の値が更新されます。

読み取り

UserDefaultsからデータを読み取るには、型に応じた専用メソッドか汎用メソッドを使います。

専用メソッドが無い型の読み取り

専用メソッドが無い型を読み取る場合は、汎用型メソッドを使って一旦Any型で読み込んだ後に、キャスト演算子(as?)で対象の型に変換します。

例えば、専用メソッドの無いDate型は次のように読み込みます。

キーに対する値が無い場合のデフォルト値の設定

キーに対する値が無い場合、基本的にはnilが返るので、次にようにnil合体演算子(??)を使ってデフォルト値を指定できます。

しかし数値型とBool型の読み取りメソッドでは、値が無い場合のデフォルト値として0またはfalseが返りますので、値が存在していたのか否かの見分けがつきません。
この場合、汎用型のobject(forKey:)メソッドを利用すると良いです。
汎用型メソッドはキーに対する値が無い場合にnilを返します。

次は、Int型で値が設定されていなかった場合に、デフォルト値99を設定する例です。

削除

特定のキーのみ削除

全てのキーを削除

スポンサーリンク

使用例

数値型

読み取りメソッドによって、取得される数値の型が決まります。
キーに対応する値が無い場合は、0が返ります。

Bool型

キーに対応する値が無い場合は、falseが返ります。

String型

Date型

専用メソッドの無い型は、一旦汎用型のobject(forKey:)メソッドで読み込んでから、対象の型にキャストします。

文字列配列

数値配列

文字列以外の配列は専用メソッドが無いので、一旦汎用型のobject(forKey:)メソッドで読み込んでから、対象の型にキャストします。
※object(forKey:)の代わりにarray(forKey:)でも動作します。

構造体・クラス

構造体・クラスは一旦Data型(バイト列を扱う型)に変換してから保存します。
変換する為には、対象の構造体・クラスをCodableプロトコルに準拠させる必要があります。

以下は、構造体をJSON形式のData型に変換してから保存し、読み込み時に元の構造体に戻す例です。

読み込み時にJSON型から構造体に変換する時の引数の記述"User.self"に若干違和感を覚えますが、変換する構造体のタイプ自体を参照する意味があります。
対象のデータが構造体の配列の場合は、次のように記述します。

スポンサーリンク

あわせて読みたい記事

【SwiftUI】SwiftUIでUserDefaultsを使う
(2020/11/8 更新) SwiftUIでUserDefaultsを使う方法を解説します。
【Swift】Codableを使ったJSON変換
Codableを使ったJSON変換について解説します。
swift
スポンサーリンク