Working with UserDefaults in iOS

Shivam Maggu
2 min readDec 22, 2023

UserDefaults provides a database to store data and it is available as long as the app is installed.

Table of Contents

Features

  • The UserDefaults class provides access to the user’s defaults database.
  • It stores data persistently across the app launches as long as the app is installed.
  • Access to the data is private to the app unless shared through App Groups.
  • Access to this database is thread-safe.
  • It is a key-value store that works through a property list (plist) file.
  • Supported data types include String, Bool, Date, Array, Dictionary, Data and Numbers.
  • Custom objects can be stored by encoding them as data.
  • We can use this to store non-sensitive data such as user preferences.

Usage

Utilising the default shared instance of UserDefaults.

import Foundation
// Set a key value in UserDefaults
UserDefaults.standard.set("Shivam", forKey: "firstname")
// Get a key value from User
DefaultsUserDefaults.standard.value(forKey: "firstname")
// Empty User
DefaultsUserDefaults.standard.removeObject(forKey: "firstname")

Creating a UserDefaults that can be shared with multiple apps and extensions.

import Foundation
// User Defaults with Suite.
// Useful for sharing data with other apps
// or extensions with app groups.
let defaults = UserDefaults(suiteName: "group.com.organisation.appname")!
// Set a key value in User Defaults
defaults.set("Shivam", forKey: "firstname")
// Get a key value from User Defaults
defaults.value(forKey: "firstname")
// Empty User Defaults
defaults.removeObject(forKey: "firstname")

Storing custom objects in UserDefaults.

import Foundation

// Custom model to be stored in UserDefaults
struct Student: Codable {
let firstname: String
let lastname: String
let grade: Int
let subjects: Array<String>
let teachers: [String: String]
let profileImage: Data
let dateModified: Date
}

// Student Object
let student = Student(firstname: "John",
lastname: "Doe",
grade: 2,
subjects: ["Hindi", "English", "Maths"],
teachers: ["Hindi": "Teacher A", "English": "Teacher b", "Maths": "Teacher X"],
profileImage: Data(),
dateModified: Date())

// Encode custom object to data and store it in UserDefaults
let encoder = JSONEncoder()
do {
let data = try encoder.encode(student)
UserDefaults.standard.setValue(data, forKey: "StudentData")
} catch {
throw error
}

// Retrieve data from UserDefaults and decode it to custom object
let decoder = JSONDecoder()
if let data = UserDefaults.standard.value(forKey: "StudentData") as? Data {
do {
let object = try decoder.decode(Student.self, from: data)
print(object)
} catch {
throw error
}
} else {
print("No data in Defaults.")
}

Using UserDefaults as a Property Wrapper

Check out this gist to use UserDefaults with Property Wrapper. This is a more generalized way to use in Projects.

Originally published at https://blog.shivammaggu.com on December 22, 2023.

--

--

Shivam Maggu
0 Followers

iOS developer specializing in swift and anything tech that piques my interest.