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

なんとかするから、なんとかなる

エンジニア関係のことを書きます

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タイプに対応していない。

おわりに

なんとかスッキリと利用することができるようになったので満足。

参考URL

github.com

qiita.com