# Defaults [![Build Status](https://travis-ci.org/sindresorhus/Defaults.svg?branch=master)](https://travis-ci.org/sindresorhus/Defaults) > Swifty and modern [UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults) ## Highlights - **Strongly typed:** You declare the type and default value upfront. - **Codable support:** You can store any [Codable](https://developer.apple.com/documentation/swift/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 With [SPM](https://swift.org/package-manager/): ```swift .package(url: "https://github.com/sindresorhus/Defaults", from: "0.1.0") ``` With [Carthage](https://github.com/Carthage/Carthage): ``` github "sindresorhus/Defaults" ``` ## Usage You declare the defaults keys upfront with type and default value. ```swift import Cocoa import Defaults extension Defaults.Keys { static let quality = Defaults.Key("quality", default: 0.8) // ^ ^ ^ ^ // Key Type UserDefaults name Default value } ``` You can then access it as a subscript on the `defaults` global (note lowercase): ```swift 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: ```swift extension Defaults.Keys { static let name = Defaults.OptionalKey("name") } if let name = defaults[.name] { print(name) } ``` ### Enum example ```swift enum DurationKeys: String, Codable { case tenMinutes = "10 Minutes" case halfHour = "30 Minutes" case oneHour = "1 Hour" } extension Defaults.Keys { static let defaultDuration = Defaults.Key("defaultDuration", default: .oneHour) } defaults[.defaultDuration].rawValue //=> "1 Hour" ``` ### It's just UserDefaults with sugar This works too: ```swift extension Defaults.Keys { static let isUnicorn = Defaults.Key("isUnicorn", default: true) } UserDefaults.standard[.isUnicorn] //=> true ``` ### Shared UserDefaults ```swift extension Defaults.Keys { static let isUnicorn = Defaults.Key("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`](https://github.com/radex/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. ## Related - [LaunchAtLogin](https://github.com/sindresorhus/LaunchAtLogin) - Add "Launch at Login" functionality to your macOS app - [DockProgress](https://github.com/sindresorhus/DockProgress) - Show progress in your app's Dock icon - [Gifski](https://github.com/sindresorhus/gifski-app) - Convert videos to high-quality GIFs on your Mac ## License MIT © [Sindre Sorhus](https://sindresorhus.com)