読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 277 - UserDefaults

2016年11月27日:Swift 3に向けて改訂開始

まだまだSegueで悩んでいて、Lecture7もなかなか終了させられません。

少し進むと知らない単語が出てきて立ち止まり先に進めない状況です。

今回ハマったのはUserDafaults*1でした。このクラス、iOSデベロッパーにはかなりお馴染みのクラスのようで、ポール先生の話しぶりから判断すれば、知ってて当たり前のような扱いですね。

私は全く知らなかったので少し勉強しました*2

アプリケーション内で共有してオブジェクトの保存、使用をするためのクラスのようです。

じつは今取り組んでいるプロジェクトPsychologistで問題に当たったんです。

Int型変数happinessの値が変化するるため、その変化するhappinessを保持させるために以下のアレーを用意しました。

var diagnosticHsitory = [Int]()

このアレーに変化したhappinessの値を保持させていきます。

diagnosticHsitory += [happiness]

しかし、このdiagnosticHsitoryはアレー型で値を格納できても、happinessの値が新しくなる毎にdiagnosticHsitoryを持つクラスが消されて新しく作り変えられるとしたらどうでしょう? このアレーに格納される値は常に1つということになります。

こういうときにUserDefaultsクラスが便利ということです。

NSUserDefaultsクラスを生成するメソッドはstandardUserDefaultsです、

private let defaults = UserDefaults.standard

もうお決まりの宣言として覚えるしかないでしょう。これでどんなオブジェクトでも格納できるdefaultsインスタンスが作られます。これはアプリケーションのどこからでもアクセス可能ということです。

このインスタンスにアクセスする方法で最も一般的なのは、コンピューテッド・プロパティ(計算型プロパティ)を使うことです。

先ほど挙げたdiagnosticHsitoryを計算型プロパティで書き換えると次のようになります。

var diagnosticHistory: [Int] {
    get { 
        return defaults.object(
            forKey: History.DefaultsKey) as? [Int] ?? [] 
        }
    set { 
        defaults.set(newValue, forKey: History.DefaultsKey) 
        }
}

なんとなく分かったような分からないような....

今日はここまで

*1:以前はNSUserDefaultsでしたがiOS10からUserDefaultsに改訂

*2:2015年10月9日:UserDefaultはシングルトン・パターンの代表でした