技術ブログ

プログラミング、IT関連の記事中心

UserDefaults【Swift】

■はじめに

アプリケーションを作成している時に、データを永続的に保存したい場合など、良くありますよね?
※私はよくあります!!

そんな時に、いくつかデータを保存する方法があります。
その中でも今回は、「UserDefaults」について記載します。
(他にも、「CoreData」「SQLite」「NSKeyedArchiver」などありますが、ここでは説明を省きます。)

■UserDefaults

UserDefaultsは、データをplistファイルに保存する事でデータを永続的に保持する方法です。

データを保存する時には一旦データをメモリに保存した後に、非同期でplistファイルへ保存します。
アプリケーションの起動時には、plistファイルのデータを全てメモリ上に展開されます。

上記にも記載した通り、plistファイルのデータを全てメモリ上に展開されるため、データ量が多いと
メモリが足りなくなり、アプリケーションが強制終了する原因となります。
そのため、大量のデータを保存することには向いておらず、アプリケーション内の設定や、ユーザー情報などの
限られた情報のみを保存する用途で使用することをお勧めします。
※大量のデータを保存する時には、「CoreData」などを使用してください。

ちなみに、保存できる件数ですが、特に決まりはありません。
メモリが足りる限り保存できるみたいです。。。

Appleの公式リファレンス】

https://developer.apple.com/documentation/foundation/userdefaults

UserDefaultsの具体的な使用方法は以下に記載します。
※NSUserDefaultsではなく、UserDefaultsの使用方法です。
※Swift3.0から「NSUserDefaults」が「UserDefaults」に変わりました。

◾️インスタンスの生成

UserDefaultsのインスタンスの生成方法は以下です。
このインスタンスを元にデータの保存や取得などの処理を行います。

// インスタンスの生成
let userDefaults = UserDefaults.standard

◾️データの保存(書き込み)

UserDefaultsのデータの保存方法は以下です。

特定の「Key」に対して、値を保存する形になります。

[UserDefaultsのインスタンス].set([設定する値], forKey: [設定する値のキー]) 

具体的な使用方法は以下です。

// インスタンスの生成
let userDefaults = UserDefaults.standard

// String型のデータの保存
userDefaults.set("TEST", forKey: "Key")
// Bool型のデータの保存
userDefaults.set(true, forKey: "Key")
// Int型のデータの保存
userDefaults.set(1, forKey: "Key")

◾️データの取得(読み込み)

UserDefaultsのデータの取得方法は以下です。

データの保存時に設定した特定の「Key」の値を取得します。

[UserDefaultsのインスタンス].[型](forKey: [設定する値のキー]) 

具体的な使用方法は以下です。

// インスタンスの生成
let userDefaults = UserDefaults.standard

// String型のデータの取得
userDefaults.string(forKey: "Key")
// Bool型のデータの取得
userDefaults.bool(forKey: "Key")
// Int型のデータの取得
userDefaults.integer(forKey: "Key")

◾️データの削除

UserDefaultsのデータの削除方法は以下です。

データの保存時に設定した特定の「Key」の値を削除します。

 [UserDefaultsのインスタンス]. removeObject(forKey: [設定する値のキー]) 

具体的な使用方法は以下です。

// インスタンスの生成
let userDefaults = UserDefaults.standard

// 型に限らずデータの削除
userDefaults.removeObject(forKey: "Key")

◾️データの存在確認

UserDefaultsのデータの存在確認方法は以下です。

データの保存時に設定した特定の「Key」のデータの存在を確認します。

 if [UserDefaultsのインスタンス].object(forKey: [設定する値のキー]) != nil {
    // データがある場合はこちらの処理
 } else {
    // データがない場合はこちらの処理
 } 

具体的な使用方法は以下です。

// インスタンスの生成
let userDefaults = UserDefaults.standard

// 型に限らずデータの存在確認
if userDefaults.object(forKey: "Key") != nil {
    // データがある場合はこちらの処理
} else {
    // データがない場合はこちらの処理
}

◾️データの同期

UserDefaultsのデータの同期方法は以下です。

このデータの同期を行わないと、データの保存、データの削除が反映されない場合があります。
※UserDefaultsはデータを非同期でplistに反映するため。。。
※基本的には、データの保存、削除の時にはすぐ後にこの処理を入れておいた方が安全です。

 [UserDefaultsのインスタンス].synchronize() 

具体的な使用方法は以下です。

// インスタンスの生成
let userDefaults = UserDefaults.standard

// データの同期
userDefaults.synchronize()