【swift】UserDefaultsについて

#UserDefaults
**ユーザーのデフォルトデータベースへのインターフェイス。アプリの起動時にキーと値のペアを永続的に保存します。**

##Declaration
```swift

class UserDefaults : NSObject
```
##概要
UserDefaultsクラスは、デフォルトシステムと対話するためのプログラムインタフェースを提供します。デフォルトシステムでは、アプリはユーザーの好みに合わせて動作をカスタマイズできます。たとえば、ユーザーが好みの測定単位やメディアの再生速度を指定できるようにすることができます。アプリは、ユーザーのデフォルトデータベースの一連のパラメータに値を割り当てることによってこれらの設定を保存します。これらのパラメータは、起動時のアプリのデフォルト状態やデフォルトの動作方法を決定するためによく使用されるため、デフォルトと呼ばれます。
実行時には、UserDefaultsオブジェクトを使用して、アプリケーションが使用するデフォルトをユーザーのデフォルトデータベースから読み取ります。 UserDefaultsは、デフォルト値が必要になるたびにユーザーのデフォルトデータベースを開かなくても済むように情報をキャッシュします。デフォルト値を設定すると、デフォルト値はプロセス内で同期的に変更され、永続ストレージや他のプロセスとは非同期的に変更されます。

**||||||||||||重要|||||||||||||||||||||||||||||||||||||||||||||||||||**
設定サブシステムに直接アクセスしないでください。プリファレンスプロパティリストファイルを変更すると、変更内容が失われたり、変更内容が反映されなかったり、アプリケーションがクラッシュしたりする可能性があります。環境設定を設定するには、代わりにmacOSのdefaultsコマンドラインユーティリティを使用してください。
**|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||**

教育機関の管理対象デバイスを除いて、ユーザーのデフォルトは単一のデバイスにローカルに保存され、バックアップと復元のために保持されます。ユーザーの接続デバイス間で設定やその他のデータを同期させるには、代わりにNSUbiquitousKeyValueStoreを使用してください。

##デフォルトオブジェクトの保存
UserDefaultsクラスは、float、double、整数、ブール値、URLなどの一般的な型にアクセスするための便利なメソッドを提供します。これらの方法はデフォルト値の設定で説明されています。
デフォルトオブジェクトはプロパティリスト、つまりNSData、NSString、NSNumber、NSDate、NSArray、またはNSDictionaryのインスタンス（またはコレクションの場合はそのインスタンスの組み合わせ）である必要があります。他の種類のオブジェクトを保存したい場合は、通常アーカイブしてNSDataのインスタンスを作成します。
可変値オブジェクトを値として設定した場合でも、UserDefaultsから返される値は不変です。たとえば、可変文字列を“ MyStringDefault”の値として設定した場合、後で文字列（forKey :)メソッドを使用して取得した文字列は不変になります。変更可能な文字列をデフォルト値として設定し、後でその文字列を変更した場合、set（_：forKey :)を再度呼び出さない限り、デフォルト値は変更された文字列値を反映しません。
詳細については、Preferences and Settings Programming Guideを参照してください。

##ファイル参照の永続化
ファイルURLはファイルシステム内の場所を指定します。 特定のファイルの場所を保存するためにset（_：forKey :)メソッドを使用し、ユーザーがそのファイルを移動した場合、アプリは次回の起動時にそのファイルを見つけることができない可能性があります。 ファイルシステムIDによってファイルへの参照を保存するには、代わりにbookmarkData（options：includesResourceValuesForKeys：relativeTo :)メソッドを使用してNSURLブックマークデータを作成し、set（_：forKey :)メソッドを使用してそれを永続化することができます。 その後、URLByResolvingBookmarkData：options：relativeToURL：bookmarkDataIsStale：error：メソッドを使用して、ユーザーデフォルトに保存されているブックマークデータをファイルURLに解決できます。

##デフォルトの変更への対応
Key-Value監視を使用して、特定のデフォルト値への更新を通知することができます。 ローカルのデフォルトデータベースに対するすべての更新を通知されるように、デフォルトの通知センターでdidChangeNotificationのオブザーバとして登録することもできます。
詳細については、 『Key-Value Observing Programming Guide』および 『Notification Programming Topics』を参照してください。

##管理環境でのデフォルトの使用
アプリが管理対象環境をサポートしている場合は、UserDefaultsを使用して、ユーザーの利益のために管理者がどの設定を管理しているかを判断できます。コンピュータラボや教室などの管理された環境では、管理者または教師は、一連のデフォルト設定をユーザーに設定してシステムを構成できます。設定がこの方法で管理されている場合（管理環境キーへのアクセスで説明されている方法で決定されるように）、アプリはユーザーがコントロールを無効または非表示にすることによってその設定を編集できないようにします。
詳細については、 『Mobile Device Management Protocol Reference』を参照してください。
教育機関によって管理されているデバイスで実行されているアプリは、iCloud Key-Valueストアを使用して、ユーザーの他のデバイス上の自分自身の他のインスタンスと少量のデータを共有できます。たとえば、教科書アプリは、起動時にそのアプリの他のインスタンスが同じページを開くことができるように、ユーザーが読んでいる現在のページ番号を格納することができます。
詳細については、 『Preferences and Settings Programming Guide』の「iCloudに環境設定を保存する」を参照してください。

##サンドボックスの考慮事項
サンドボックス化されたアプリは、次の例外を除いて、他のアプリの設定にアクセスしたり変更したりすることはできません。
macOSとiOSのアプリ拡張
macOS上のアプリケーショングループ内の他のアプリ
addSuite（named :)メソッドを使用してサードパーティのアプリのドメインを追加しても、アプリがそのアプリの設定にアクセスすることは許可されません。 他のアプリの設定にアクセスしたり変更したりしてもエラーにはなりません。 代わりに、macOSは他のアプリケーションの実際の設定ファイルではなく、あなたのアプリケーションのコンテナ内にあるファイルを読み書きします。

##スレッドセーフ
UserDefaultsクラスはスレッドセーフです。

#Topics