UserPreference

ユーザー設定を保存するためのパッケージになります。 UserDefaultsNSUbiquitousKeyValueStoreへのユーティリティで、Codableに準拠した値を保存できます。

Features

保存Storeの指定

UserPreferenceにはKeyValueStorableプロトコルに準拠したストアを指定することができます。 デフォルトではUserDefaultsNSUbiquitousKeyValueStoreKeyValueStorableに準拠させています。

class Preference: UserPreferences {
    /// 保存するストアを指定
    var store: KeyValueStorable { UserDefaults.standard }
    /// v1というプロパティを定義
    @UserPreferenceValue("v1", defaultValue: 0)
    var v1: Int
}

plistに合わせたデータ保存

独自のEncoderを使い、Codableな値をplistの構造に合わせた形式に変換して保存します。 よくあるUserDefaults系のラッパーは、CodableのEncodeにJSONEncoder.encode()のDataを直接保存するためplistにはData形式で保存されてしまいます。 そうするとargumentDomainを使用する場合や、plistを開いて編集することが困難になるため、KeydContainerな値はplistのDictionaryとして保存されます。

カテゴリ別の保存

複数のUserPreferenceを使用する場合、UserDefaultsのキーが競合しないようにCategoryを設定することができます。

class UserTheme1: UserPreferences {
    /// 保存するカテゴリを指定
    var category: Category = .init("theme1")
    /// v1というプロパティを定義
    @UserPreferenceValue("v1", defaultValue: 0)
    var v1: Int
}

class UserTheme2: UserPreferences {
    /// 保存するカテゴリを指定
    var category: Category = .init("theme2")
    /// カテゴリが分かれているので同名のプロパティ名でも問題ない
    @UserPreferenceValue("v1", defaultValue: 0)
    var v1: Int
}