NSUserDefaultsにプロパティで値を保存・取得するSwiftラッパークラス

スポンサーリンク

iOS 開発において NSUserDefaults(User Defaults)を使うと、簡単にデータを永続化して保存できます。Key/Value 方式で任意のオブジェクトの保存・読み込みが可能です。

— 環境 —
Swift 1.2
Xcode 6.3.2

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

NSUserDefaults 使い方の基本

NSUserDefaults を素のままで使う方法は以下の通り。

上述のように、NSUserDefaults は簡単に扱うことができます。

特筆するとしたら、デフォルト値を NSUserDefaults#registerDefaults() メソッドに [ key: value ] のディクショナリを渡すことで設定できます。key が存在しない時にのみ、value をデフォルト値として初期化して設定してくれるので便利です。

NSUserDefaults にプロパティでアクセスするラッパー

簡単に扱える NSUserDefaults なのですが、アプリケーションの設定値などは、色んなコントローラーから取得したり、また設定画面などから変更したりするので、もっと簡単にプロパティ形式で取得・保存できるようにしたかった。理想としては NSUserDefaults に対して、以下のような感じで設定を保存したり取得できたら楽だな〜と。

Swift のコードでこれを実現するために、NSUserDefaults のラッパークラスとして、設定値を操作する AppSetting クラスを作りました。クラス変数としてのコンピューティッドプロパティ(Computed Property)を使う方法で実装してみたところ、上手く動作した。コードは以下の通り。

AppSetting.swift

Computed Property の get でキーが存在しなかった時のためにデフォルト値を設定するようにしています。その後、キーを指定して値を取得。また、set でキーを指定して値を保存するようにしています。

以下、Playground での実行結果。

これで NSUserDefaults を使ったアプリのグローバルな設定値などの取得・保存が、ものすごく簡単に行えるようになりました。任意のコントローラーの箇所で、AppSetting を通して設定値を取得・保存できます。懸念は Swift のバージョンアップでコードが動かなくなる可能性があることですかね。試行錯誤して書いたコードですので、まずい箇所があったら教えて下さい。

本当は Computed Property でプロパティ名を文字列で評価して、Ruby でいう Module#define_method や Object#send を使ったメタプログラミングのように書きたかったのですが、現状の私の Swift 力では無理でした。それができればコード量がぐっと減らせるのですけど。そもそも Swift はメタプログラミングできるんでしょうか…それすら知りません。

あとクラス(class)や構造体(struct)のプロパティ一覧を取得したいとも考えたのですが、これも Swift でのやり方が分からなかった。プロパティ一覧が取得できれば、ライブラリ化できるかな〜と思いまして。Swift でのメタプログラミングをちょっと調べてみようと思います。

スポンサーリンク
 
スポンサーリンク

Leave Your Message!