Swiftでの開発にも慣れてきたので、今まで作ったアプリの機能のうち、ライブラリ化できそうなものを選んで、独自ライブラリの充実を進めています。最近も、新しい機能をライブラリ化しました。どのアプリにも必ず付ける、環境設定の機能です。どのように仕上がったのか、その過程も含めて紹介します。
いつものように全体設計から始めます。つまり、大まかな仕様を決めてから、作り始めるという私なりの手順です。まずは、過去に作った環境設定の話から。
今までの環境設定は、どのアプリでも、1つのクラスとして作りました。仕様はほぼ共通です。環境設定のデフォルト値を持ち、アプリの初期状態では、その値を使います。環境設定の画面も用意し、その画面で設定を変更すると、設定値をファイルに保存します。
アプリを起動したときは、環境設定ファイルの存在を調べ、それがあればファイル内の値を採用します。逆にファイルが存在しなければ、デフォルトの値を採用します。
ただし、環境設定の値の中には、バージョン番号も含まれます。アプリのバージョン番号ではなくて、環境設定のフォーマットのバージョン番号です。アプリのバージョンが上がっても、環境設定に含まれる項目が同じなら、環境設定のバージョン番号は同じままです。当然、環境設定のフォーマットが変わると、環境設定のバージョン番号が変わります。
アプリの起動時に、環境設定ファイルを読み込みますが、読み込み後には環境設定バージョンもチェックします。アプリ側でもデフォルトの環境設定値を持ち、それにもバージョン番号が含まれます。両者のバージョン番号を比べて、もし一致していなければ、環境設定ファイルは無視されて、デフォルトの環境設定値が使われます。
環境設定がバージョンアップしたとき、環境設定値の移行は行なっていません。最初の頃はやっていたのですが、使っているユーザー数が少ないので、手動で再設定してもらっても文句を言われないと判明しました。無駄な開発はしたくないので、今はやらなくなりました。
環境設定ファイルの保存場所は、アプリのDocumentsフォルダで決まりです。ここに入れておくとiTunesから見れて、手動でもバックアップが取れます。試用段階で使った環境設定ファイルを、そのまま本番用にコピーすることもでき、本番時に環境設定をやらなくて済むメリットもあります。このような方法が使えるのも、設定値の移行処理が不要と判断した理由です。
以上のような形が、私に必要な環境設定の形です。バージョン番号を持ち、ファイルに保存でき、バージョン番号の古い環境設定ファイルは無視するという機能が必要です。
続いて、環境設定に含める値の種類です。とりあえず、Int、Float、String、Boolの4種類があれば大丈夫です。複数の値をセットで扱うグループ分けも、使う際のグループ指定が面倒そうなので、なくて構いません。
それぞれの値に、キーは必要です。キーを文字列で指定して、値を設定したり、保存値を得たりする使い方が良いでしょう。キーごとに値の種類を決めて使うことになりますが、データ型をわざわざ指定するような形ではなく、入れた値で自動判定するような使い方がベストです。
ただし、使う際のチェックは多めに入れたいと思います。間違ったキーを指定したとき、保存されているのと違うタイプのデータ型を要求したとか、環境設定値が空なのに読みにいったとか、使い方の間違いを知らせてくれる機能は付けましょう。
Swiftの魅力の1つでもある、コンパイラーによる型チェックを有効に使うことも、非常に重要な点です。環境設定機能のように、異なるデータ型を扱える処理の場合は、何でも入れられるデータ型を1つ用意して、それを全種類のデータに使いたくなります。そうすると、コンパイラーによる型チェックが使えず、実行時にエラーが発生しがちです。そうならないように、データ型を指定したメソッドを用意して、意識的に使い分ける形にします。
以上のような環境設定機能を、Swiftのクラスとして作ります。必要なメソッド整理すると、次のようになります。
環境設定クラスの大まかな構成
・初期化メソッド:保存ファイル名やデフォルト値を渡して初期化
・ファイル保存メソッド:設定値をファイルに保存(バージョン番号の含めて)
・ファイル読込メソッド:ファイルから設定値を読み込む(バージョン番号の確認も)
・環境設定値の取得(データ型ごとに作る):指定されたキーの設定値を返す
・環境設定値の設定(データ型ごとに作る):指定されたキーの設定値を更新(追加は不可)
環境設定値の設定では、新しいキーを途中で追加することはありません。最初から種類が決まっていますから、全種類を含めたデフォルト値を最初に用意して、あとは値を更新するだけです。
これらの機能は、かなり簡単に作れるでしょう。一番大事なのは、エラーチェックです。今まで挙がったものを整理すると、次のようになります。
取得と設定でのチェック内容
・環境設定が空かどうか
・指定されたキーが存在するかどうか
・取得する既存データの型が、使われたメソッドの返り値の型と一致しているか
・更新対象となる既存データの型が、更新するデータの型と一致しているか
環境設定を使い始めるときは、使い勝手を重視して、型の指定を特にはしません。そのため、環境設定値を取得したり更新するときには、既存の環境設定値が持っているデータ型を調べて、違ってないかチェックする形にします。アプリから呼び出されて使われるライブラリですから、どんな操作でも勝手にされるわけではありません。あくまで、間違った使い方を発見するためのチェックですから、ほどほどのチェック内容にしておき、使い勝手を優先したほうが良いと判断しました。
一応、環境設定のデータ構成も。あえて書くと、次のような形になります。
環境設定のデータ構成(以下のペアを何組でも)
・キー:String
・値:Int,Float,String,Boolの4種類の中から1つだけ
使い勝手を優先したため、キーごとにデータ型を指定する項目は含まれません。これだけでも、実用的には十分だと思います。
ここまで整理できたので、あとは作るだけです。大まかな仕様を見る限り、コンパクトにまとまったクラスになると予想できます。次回の投稿で、具体的なSwiftコードを紹介します。
0 件のコメント:
コメントを投稿