Programming language: Swift
License: MIT License
Tags: Database    
Latest version: v0.2.0

UserDefaults alternatives and similar libraries

Based on the "Database" category.
Alternatively, view UserDefaults alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of UserDefaults or a related project?

Add another 'Database' Library



cocoapods compatible carthage compatible language swift


DefaultsKit leverages Swift 4's powerful Codable capabilities to provide a Simple and Strongly Typed wrapper on top of UserDefaults. It uses less than 70 lines of code to acomplish this.

Installation >> instructions <<


Instantiate, or get a shared instance of Defaults

let defaults = Defaults() // or Defaults.shared


// Define a key
let key = Key<String>("someKey")

// Set a value
defaults.set("Codable FTW ๐Ÿ˜ƒ", for: key)

// Read the value back
defaults.get(for: key) // Output: Codable FTW ๐Ÿ˜ƒ

Check if a key has a value:

if defaults.has(key) { 
    // Do your thing

If you just need to know that a key/value pair exists, without actually using the value, use the has() method instead of the optional get(for:key). For complex objects it will prevent any unnecessary deserialization.

Implicit Member Expression

You can find a convenience wrapper for your keys by extending DefaultsKey. This allows you use Implicit Member Expression:

// Extend with a custom key
extension DefaultsKey {
    static let someKey = Key<String>("someKey")

// Then use it like this
defaults.set("Some key", for: .someKey)
defaults.get(for: .someKey) // Output: Some key

Complex objects

To store a complex object just conform to the Codable protocol:

struct Person: Codable {
    let name: String
    let age: Int


// Create a key
let key = Key<Person>("personKey")

// Get an instance of your Codable conforming enum, struct or class
let person = Person(name: "Bonnie Greenwell", age: 80)

// Set the value
defaults.set(person, for: key)

And finally:

// Read it back
let person = defaults.get(for: key)
person?.name // Bonnie Greenwell
person?.age  // 80

Nested Objects

You can also use nested objects as long as they conform to the Codable protocol:

enum Pet: String, Codable {
    case cat
    case dog

struct Person: Codable {
    let name: String
    let pets: [Pet]

// Get a Codable conforming instante
let person = Person(name: "Claire", pets: [.cat])

// Set the value
defaults.set(person, for: key)

// And read it back
let person = defaults.get(for: key)
person?.name        // Claire
person?.pets.first  // cat


DefaultsKit is released under the MIT license. See LICENSE for details.

Help Wanted

Review/Translate [README.zh-CN.md](README.zh-CN.md) to Chinese

Chinese is the #1 spoken language in the world and I'd love to have DefaultsKit be more inclusive, unfortunately I don't speak Chinese. If you know chinese, and would like to help out, please see issue #1

Thank you ๐Ÿ™

*Note that all licence references and agreements mentioned in the UserDefaults README section above are relevant to that project's source code only.