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

A Day In The Life

とあるプログラマの備忘録

UserDefaultsのキー名をenumで管理する

NSUserDefaults あらため UserDefaults のキーを enum で管理する方法(Swift3対応)です。UserDefaults のキーを enum で管理する方法はいくつか見つけたのですが Swift3 に対応しているものが見つからなかったので書きました。

キーに文字列リテラルを直接指定したくない

UserDefaults のキーを文字列リテラルでやり取りするのはタイプミスなどのリスクが高く enum で管理したほうがコンパイルエラーでミスを検知できるのでオススメです。

import Foundation

enum UserSettings: String {
  case autoPlay = "autoPlay"
  case purchasedItems = "purchasedItems"
  :
  : キーをこちらに宣言する
  :
  
  func set(value: Int) {
    UserDefaults.standard.set(value, forKey: self.rawValue)
    UserDefaults.standard.synchronize()
  }
 
  func integer() -> Int {
    return UserDefaults.standard.integer(forKey: self.rawValue)
  }
    
  func set(value: Float) {
    UserDefaults.standard.set(value, forKey: self.rawValue)
    UserDefaults.standard.synchronize()
  }
    
  func float() -> Float {
    return UserDefaults.standard.float(forKey: self.rawValue)
  }
    
  func set(value: Double) {
    UserDefaults.standard.set(value, forKey: self.rawValue)
    UserDefaults.standard.synchronize()
  }
    
  func double() -> Double {
    return UserDefaults.standard.double(forKey: self.rawValue)
  }
    
  func set(value: Bool) {
    UserDefaults.standard.set(value, forKey: self.rawValue)
    UserDefaults.standard.synchronize()
  }
    
  func bool() -> Bool {
    return UserDefaults.standard.bool(forKey: self.rawValue)
  }

  func set(value: Any) {
    UserDefaults.standard.set(value, forKey: self.rawValue)
    UserDefaults.standard.synchronize()
  }
    
  func object() -> Any? {
    return UserDefaults.standard.object(forKey: self.rawValue)
  }
}

Int, Float, Double, Bool はオプショナル型を使いたくなかったのでそれぞれメソッドを定義しました。 使い方はこんな感じになります。

// Bool
UserSettings.autoPlay.set(value: true)
let autoPlay: Bool = UserSettings.autoPlay.bool()

// Array
UserSettings.purchasedItems.set(value: ["item1", "item2", "item3"])
if let items = UserSettings.purchasedItems.object() as? [String] {
  print(items.count)
}      

もう一つのメリット

UserDefaults を使う場所を一元管理できるメリットもあります。アプリのいろんな場所で UserDefaults を使いまくって一体どんなデータが保存されてるかわかりませんってなったことありませんか?(自分はよくあります)

参考記事