Swifty and modern UserDefaults
- 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.
- macOS 10.12+
- iOS 10+
- tvOS 10+
- watchOS 3+
With SPM:
.package(url: "https://github.com/sindresorhus/Defaults", from: "0.2.0")With Carthage:
github "sindresorhus/Defaults"
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 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"This works too:
extension Defaults.Keys {
static let isUnicorn = Defaults.Key<Bool>("isUnicorn", default: true)
}
UserDefaults.standard[.isUnicorn]
//=> trueextension Defaults.Keys {
static let isUnicorn = Defaults.Key<Bool>("isUnicorn", default: true)
}
let extensionDefaults = UserDefaults(suiteName: "com.unicorn.app")!
extensionDefaults[.isUnicorn]
//=> trueType: class
Stores the keys.
Type: class
Create a key with a default value.
Type: class
Create a key with an optional value.
Type: func
Clear the user defaults.
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.
- 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
MIT © Sindre Sorhus