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+
- Xcode 9.3+
- Swift 4.1+
With SPM:
.package(url: "https://github.com/sindresorhus/Defaults", from: "0.1.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]
//=> true
extension Defaults.Keys {
static let isUnicorn = Defaults.Key<Bool>("isUnicorn", default: true)
}
let extensionDefaults = UserDefaults(suiteName: "com.unicorn.app")!
extensionDefaults[.isUnicorn]
//=> true
Type: 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