Swift Playgroundsで学ぶiOSプログラミング 第78回
アーカイバー/アンアーカイバーを使う
ファイルとして保存したオブジェクトを展開して元に戻す方法
2018年03月05日 17時00分更新
このところ、プログラム内で扱うデータをファイルとして保存したり、逆にファイルから読み込む方法を、あれこれと取り上げています。またかと思われるのは覚悟のうえで、とりあえずあと1回だけ、今回もその話題を続けることにします。
今回使ってみるのは、NSKeyedArchiverとNSKeyedUnarchiverというクラスです。前者が、オブジェクトをそっくりそのままファイルに保存する機能を発揮するアーカイバーで、後者が反対にファイルから読み込んだ内容をオブジェクトとして再現させる働きを持ったアンアーカイバーです。言うまでもなくペアで使います。
名前が「NS」で始まっていることからわかるように、これはObjective-C時代からある、iOSにとって伝統的なクラスです。いまのところ、これに代わるSwift専用のクラスは用意されていないので、まだバリバリ現役で活躍します。少なくともこれまで取り上げた同様の機能の中では、もっとも汎用性が高く、あまり用途を選ばずに使えるでしょう。
これらのクラスを使えば、iOSの基本的なデータ型だけでなく、ユーザーインターフェースの部品を含む、規定の多くのクラスのオブジェクトをアーカイブ/アンアーカイブすることができます。それだけでなく、自分で定義するカスタムなクラスのオブジェクトも扱うことが可能です。ただし、そのためには、そのクラスが、ある規則に従っている必要があります。それは、NSCodingプロトコルに準拠し、エンコードやデコードのための所定のメソッドを実装していることです。今回は、独自クラスの扱いまでは触れませんが、NSKeyedArchiverとNSKeyedUnarchiverの基本的な使い方を解説します。それによって、半永続的なデータの保存/再生という、iOSアプリにとって非常に重要な機能を使いこなせるようになるでしょう。
基本的な配列と辞書オブジェクトをファイル化/展開する
まずは、できるだけ簡単なプログラムで基本的な使い方を確かめておきましょう。最初はユーザーインターフェースも用意しないので、インポートするのはFoundationです。
この例では、1つの辞書を保存し、それを読み込むことにします。そのためのサンプルデータとしてまず文字列の配列を用意し、その配列を要素として含む辞書を定義しています。この機能でアーカイブ/アンアーカイブできる配列や辞書は、基本的には頭に「NS」の付いたNSArray、NSDictionaryなので、明示的にそれらのクラスを指定しています。アーカイブしたファイルを保存する場所は、NSSearchPathForDirectoriesInDomainsという非常に長い名前のファンクションを使って、ドキュメント用のディレクトリとして取得しています。
このファンクションが返すのはディレクトリの配列ですが、その最初の要素だけを使います。それが有効なディレクトリであれば、その名前の後ろにファイル名として仮に「/dict.plist」をつけていますが、これは何でもかまいません。これで保存するファイルのフルパスが得られました。
このプログラムでは、まずそのファイルを読み込んでみて、それがnil(空)であれば上で定義した辞書をアーカイブして保存しています。最初に起動した時はnilなので、最初は必ず保存することになります。その後、そのファイルを読み込んでアンアーカイブしています。
実際に動かしてみると、2回目以降は書き込みの動作は実行せず、読み込むだけになります。
読み込んだ内容は、とりあえず要素が3つの辞書となりますが、その中身をデバッグ機能を使って調べると、上で定義した辞書が読み込まれ、再現されていることが確認できます。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ