Swift 4時代のプロパティリストの読み込み方法
上で述べたように、このプログラムは現時点では問題なく動くのですが、それがいつまで続くのか保証はありません。Swift時代にふさわしく、NSArrayやNSDictionaryを使わずに、SwiftのArrayやDictionaryオブジェクトにプロパティリストの内容を読み込む方法があるはずです。ほかにも考えられるかもしれませんが、ここでは、いったんDataオブジェクトにプロパティリストの内容をそのまま読み込んでから、その後PropertyListSerializationというクラスを使って、DataオブジェクトをArrayやDictionaryに変換する方法を示します。
ArrayやDictionaryには、直接ファイルとやり取りする機能はないので、Dataを経由するのはやむを得ないところです。DataはSwiftならではのクラスなので、Swift時代にふさわしい方法と言えます。さらにこの方法では、メモリ内のデータ転送に比べれば不確実なファイルの読み込みに対して、エラー処理機能を最初から考えてあるなど、モダンな設計になっています。結果は同じになるはずなので、動かして確認してみてください。
プロパティリストから読み込んだデータにもとづいてプログラムを動作させる
このようにプロパティリストにデータを記録しておくと、プログラムには直接データを記述する必要がなくなります。これは、プログラムのメンテナンスという点で、大きなメリットがあります。あとで何らかの事情でデータが更新されても、プログラム自体には一切手を加える必要はなく、プロパティリストさえ更新すればいいのです。
今回の最大の目的は、新しいプロパティリストの読み込み方法を示すことなので、すでにその目標には達していることになります。とはいえ、それだけでは実感もわかないので、応用として、テーブルビューとウェブビューを使って、読み込んだ内容を表示してみることにしましょう。このあたりの表示については、いつも使っている手法なので詳しい説明は省きます。プログラムの構成をざっと確認しておきましょう。
まずUIViewControllerのサブクラスとして、AppViewControllerを定義し、そのviewDidLoadメソッドの中で、プロパティリストを読み込みます。その方法は、上で示したものとまったく同じです。
このクラスでは、読み込んだプロパティリストの配列に含まれる要素の、「name」と「icon」のキーに付随するデータをテーブルビューに表示します。
そのためには、当然ながらアイコンに相当する画像ファイルが必要となります。それは、アップルの製品サイトのページのスクリーンショットから切り出したものを、プロパティリストで指定したアイコンのファイル名に合わせて作成し、あらかじめプロパティリスト本体と同じ方法でプレイグラウンドに追加しておきます。
テーブルビューの標準的なセルに表示するアイコンの画像は、32×32ピクセルくらいがちょうどいいのですが、ここではスクリーンショットの都合で50x50になっています。そのため、テーブルビューの罫線からはみ出しています。これはこれで面白い表示になっているので、そのままにしました。
これでテーブルビューの表示はできましたが、プロパティリストには、まだ使っていないデータが含まれています。各macOSアプリの説明を表示するページへのリンクです。そこで、ユーザーがテーブルビューのセルをタップすると、新たなUIViewControllerのオブジェクトを作成し、そのビューをウェブビューに入れ替え、そこにプロパティリストの「link」キーに付随する値のURLから読み込んだ内容を表示するようにしてみます。
テーブルビューとウェブビューを切り替えるために、ナビゲーションコントローラーも導入しています。そしてテーブルビューのナビゲーションバーには「macOSアプリ」というタイトルを表示するようにしました。
これで、どれかのアプリ名をタップすると、その説明が表示されるようになりました。
結局今回のプログラムは、macOSのアプリカタログのようなものになりました。
次回の予定
今回もプロパティリストの読み込みという、それ自体はかなり地味なトピックとなりました。このような機能には、なかなか興味も湧きにくいかもしれませんが、視覚的に派手なデモを一歩脱して実用的なプログラムを作るためには不可欠のものです。次回も、もう1回だけ、例によって「iOSのデータの扱い」に関する機能を取り上げる予定です。