UserDefaults Helper Class — An Easy way to use UserDefaults

Sujal Shrestha
2 min readOct 2, 2019

As an iOS developer, we all have dealt with UserDefaults. It’s a great tool for local persistence. Here is a simple example of UserDefaults.

let defaults = UserDefaults.standard
//To save data
defaults.set("user001", forKey: "userId")
defaults.set(true, forKey: "isAdmin")
//To retrieve data
let id= defaults.string(forKey: "userId")
let userType = defaults.bool(forKey: "isAdmin")

The problem we’ll face is we’ll have to remember the key values i.e “userId”, “isAdmin”. If we want to fetch userId in any part of our code, we need to remember that there is a key named “userId”. This can get cumbersome if there’re several developers in the same project as we’ll have to remember the key values.

The solution: Using Enums

enum UserDefaultKeys: String, CaseIterable {
case userId
case isAdmin
case pinCode
}

We create a simple enum with the required number of cases. Likewise, we confirm to CaseIterable protocol which will help us loop through these cases when we need it — as we’ll see it in coming example.

Now, we’ll create a generic helper class to set, retrieve and remove data in UserDefaults.

final class UserDefaultsHelper {static func setData<T>(value: T, key: UserDefaultKeys) {
let defaults = UserDefaults.standard
defaults.set(value, forKey: key.rawValue)
}
static func getData<T>(type: T.Type, forKey: UserDefaultKeys) -> T? {
let defaults = UserDefaults.standard
let value= defaults.object(forKey: forKey.rawValue) as? T
return value
}
static func removeData(key: UserDefaultKeys) {
let defaults = UserDefaults.standard
defaults.removeObject(forKey: key.rawValue)
}
}

To set/save data, we can use this code from anywhere in our code.

UserDefaultsHelper.setData(value: "user-001", key: .userId)UserDefaultsHelper.setData(value: true, key: .isAdmin)UserDefaultsHelper.setData(value: 123, key: .pinCode)

To get the data:

let id = UserDefaultsHelper.getData(type: String.self, forKey: .userId)let userType = UserDefaultsHelper.getData(type: Bool.self, forKey: .isAdmin)let code = UserDefaultsHelper.getData(type: Int.self, forKey: .pinCode)

To remove or clear all data in UserDefaults, we can use:

_ = UserDefaultKeys.allCases.map({ UserDefaultsHelper.removeData(key: $0) })// We've confirmed to CaseIterable, hence we can use allCases here.

--

--