iOSで使いにくいUserDefaultをなんとかする
はじめに
iOSアプリにおいて、アプリを消しても値を保存しておける、UserDefaultはとても便利だと思う。 しかしながら、どうしても使いにくい部分が存在する。 例えば、UserDefaultの値を取り出すKeyがStringなところだ。
よくある使い方
// 保存する UserDefaults.standard.set("sample", forKey: "sampleKey") UserDefaults.standard.synchronize() // とりだす var str = UserDefaults.standard.string(forKey: "sampleKey")
- Key値をタイポすると実行時まで築くことができない
- stored propertyのように使用したい
stored propertyのように振る舞うために
前準備
class DefaultsKeys { static let sampleKey = DefaultsKey<String>("sampleKey") private init() {} } class DefaultsKey<ValueType>: DefaultsKeys { let key: String init(_ key: String) { self.key = key } } extension UserDefaults { subscript(key: DefaultsKey<String>) -> String { get { if let value = string(forKey: key.key) { return value } else { return "" } } set { set(newValue,forkey: key.key) synchronize() } } }
使い方
UserDefaults.standard[.sampleKey] = "sample" let str = UserDefaults.standard[.sampleKey]
その他
- static let sampleKey のところを増やすことでKeyを増やせる
- subscript を増やせばString以外にも対応可能
- DefalutsKeyとDefaultsKeysを統合したかったのですが、staticプロパティはGenericタイプに対応していない。
おわりに
なんとかスッキリと利用することができるようになったので満足。