💾 Swifty and modern UserDefaults
Go to file
Sindre Sorhus 337c302d2a Meta tweaks 2018-08-28 10:29:05 +07:00
Configs Meta tweaks 2018-08-28 10:29:05 +07:00
Defaults.xcodeproj Meta tweaks 2018-08-28 10:29:05 +07:00
Sources Meta tweaks 2018-08-28 10:29:05 +07:00
Tests/DefaultsTests Correctly set `nil` for `OptionalKey` 2018-05-14 15:27:35 +07:00
.editorconfig Init 2018-04-12 01:06:24 +07:00
.gitattributes Meta tweaks 2018-08-28 10:29:05 +07:00
.gitignore Init 2018-04-12 01:06:24 +07:00
.travis.yml Add support for iOS, tvOS, watchOS 2018-04-16 16:50:36 +07:00
Defaults.podspec Meta tweaks 2018-08-28 10:29:05 +07:00
Package.swift Meta tweaks 2018-08-28 10:29:05 +07:00
license Init 2018-04-12 01:06:24 +07:00
readme.md Meta tweaks 2018-08-28 10:29:05 +07:00

readme.md

Defaults Build Status

Swifty and modern UserDefaults

Highlights

  • Strongly typed: You declare the type and default value upfront.
  • Codable support: You can store any Codable value, like an enum.
  • Debuggable: The data is stored as JSON-serialized values.
  • Lightweight: It's only ~100 lines of code.

Compatibility

  • macOS 10.12+
  • iOS 10+
  • tvOS 10+
  • watchOS 3+

Install

SPM

.package(url: "https://github.com/sindresorhus/Defaults", from: "0.2.0")

Carthage

github "sindresorhus/Defaults"

CocoaPods

pod 'Defaults'

Usage

You declare the defaults keys upfront with type and default value.

import Cocoa
import Defaults

extension Defaults.Keys {
	static let quality = Defaults.Key<Double>("quality", default: 0.8)
	//            ^                     ^         ^                ^
	//           Key                   Type   UserDefaults name   Default value
}

You can then access it as a subscript on the defaults global (note lowercase):

defaults[.quality]
//=> 0.8

defaults[.quality] = 0.5
//=> 0.5

defaults[.quality] += 0.1
//=> 0.6

defaults[.quality] = "🦄"
//=> [Cannot assign value of type 'String' to type 'Double']

You can also declare optional keys for when you don't want to declare a default value upfront:

extension Defaults.Keys {
	static let name = Defaults.OptionalKey<Double>("name")
}

if let name = defaults[.name] {
	print(name)
}

Enum example

enum DurationKeys: String, Codable {
	case tenMinutes = "10 Minutes"
	case halfHour = "30 Minutes"
	case oneHour = "1 Hour"
}

extension Defaults.Keys {
	static let defaultDuration = Defaults.Key<DurationKeys>("defaultDuration", default: .oneHour)
}

defaults[.defaultDuration].rawValue
//=> "1 Hour"

It's just UserDefaults with sugar

This works too:

extension Defaults.Keys {
	static let isUnicorn = Defaults.Key<Bool>("isUnicorn", default: true)
}

UserDefaults.standard[.isUnicorn]
//=> true

Shared UserDefaults

extension Defaults.Keys {
	static let isUnicorn = Defaults.Key<Bool>("isUnicorn", default: true)
}

let extensionDefaults = UserDefaults(suiteName: "com.unicorn.app")!

extensionDefaults[.isUnicorn]
//=> true

API

let defaults = Defaults()

Defaults.Keys

Type: class

Stores the keys.

Defaults.Key

Type: class

Create a key with a default value.

Defaults.OptionalKey

Type: class

Create a key with an optional value.

defaults.clear()

Type: func

Clear the user defaults.

FAQ

How is this different from SwiftyUserDefaults?

It's inspired by it and other solutions. The main difference is that this module doesn't hardcode the default values and comes with Codable support.

  • Preferences - Add a preferences window to your macOS app in minutes
  • LaunchAtLogin - Add "Launch at Login" functionality to your macOS app
  • DockProgress - Show progress in your app's Dock icon
  • Gifski - Convert videos to high-quality GIFs on your Mac

License

MIT © Sindre Sorhus