このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング第78回

アーカイバー/アンアーカイバーを使う

ファイルとして保存したオブジェクトを展開して元に戻す方法

2018年03月05日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 このところ、プログラム内で扱うデータをファイルとして保存したり、逆にファイルから読み込む方法を、あれこれと取り上げています。またかと思われるのは覚悟のうえで、とりあえずあと1回だけ、今回もその話題を続けることにします。

 今回使ってみるのは、NSKeyedArchiverとNSKeyedUnarchiverというクラスです。前者が、オブジェクトをそっくりそのままファイルに保存する機能を発揮するアーカイバーで、後者が反対にファイルから読み込んだ内容をオブジェクトとして再現させる働きを持ったアンアーカイバーです。言うまでもなくペアで使います。

 名前が「NS」で始まっていることからわかるように、これはObjective-C時代からある、iOSにとって伝統的なクラスです。いまのところ、これに代わるSwift専用のクラスは用意されていないので、まだバリバリ現役で活躍します。少なくともこれまで取り上げた同様の機能の中では、もっとも汎用性が高く、あまり用途を選ばずに使えるでしょう。

 これらのクラスを使えば、iOSの基本的なデータ型だけでなく、ユーザーインターフェースの部品を含む、規定の多くのクラスのオブジェクトをアーカイブ/アンアーカイブすることができます。それだけでなく、自分で定義するカスタムなクラスのオブジェクトも扱うことが可能です。ただし、そのためには、そのクラスが、ある規則に従っている必要があります。それは、NSCodingプロトコルに準拠し、エンコードやデコードのための所定のメソッドを実装していることです。今回は、独自クラスの扱いまでは触れませんが、NSKeyedArchiverとNSKeyedUnarchiverの基本的な使い方を解説します。それによって、半永続的なデータの保存/再生という、iOSアプリにとって非常に重要な機能を使いこなせるようになるでしょう。

基本的な配列と辞書オブジェクトをファイル化/展開する

 まずは、できるだけ簡単なプログラムで基本的な使い方を確かめておきましょう。最初はユーザーインターフェースも用意しないので、インポートするのはFoundationです。

NSKeyedArchiverとNSKeyedUnarchiverを組み合わせて使うと、任意のオブジェクトをアーカイブしながらファイル保存、ファイルから読み込みながらアンアーカイブして元のオブジェクトに戻すといった操作が簡単にできます

 この例では、1つの辞書を保存し、それを読み込むことにします。そのためのサンプルデータとしてまず文字列の配列を用意し、その配列を要素として含む辞書を定義しています。この機能でアーカイブ/アンアーカイブできる配列や辞書は、基本的には頭に「NS」の付いたNSArray、NSDictionaryなので、明示的にそれらのクラスを指定しています。アーカイブしたファイルを保存する場所は、NSSearchPathForDirectoriesInDomainsという非常に長い名前のファンクションを使って、ドキュメント用のディレクトリとして取得しています。

 このファンクションが返すのはディレクトリの配列ですが、その最初の要素だけを使います。それが有効なディレクトリであれば、その名前の後ろにファイル名として仮に「/dict.plist」をつけていますが、これは何でもかまいません。これで保存するファイルのフルパスが得られました。

 このプログラムでは、まずそのファイルを読み込んでみて、それがnil(空)であれば上で定義した辞書をアーカイブして保存しています。最初に起動した時はnilなので、最初は必ず保存することになります。その後、そのファイルを読み込んでアンアーカイブしています。

 実際に動かしてみると、2回目以降は書き込みの動作は実行せず、読み込むだけになります。

3つの要素を含む辞書をアーカイブして保存し、それを読み込んでアナーカイブした結果をプレイグラウンドのデバッグ機能を使って確認しています

 読み込んだ内容は、とりあえず要素が3つの辞書となりますが、その中身をデバッグ機能を使って調べると、上で定義した辞書が読み込まれ、再現されていることが確認できます。

再現した辞書の内容を確認すると、「str」というキーに対して「Ascii倶楽部」という文字列が記録され、正しく再現されたことが確認できます

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!