DefaultsKit is a lightweight Swift library that builds on Codable to offer a Simple, Strongly Typed and compact wrapper for UserDefaults. With fewer than 100 lines of code, it’s both easy to use and highly efficient.
Installation >> instructions <<
Instantiate, or get a shared instance of Defaults
let defaults = Defaults() // or Defaults.sharedThen:
// 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 😃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 optionalget(for:key). For complex objects it will prevent any unnecessary deserialization.
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 var someKey: Key<Int> { Key("someKey") } } // Then use it like this defaults.set("Some key", for: .someKey) defaults.get(for: .someKey) // Output: Some keyTo store a complex object just conform to the Codable protocol:
struct Person: Codable { let name: String let age: Int }Then:
// 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 // 80You 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 // catDefaultsKit is released under the MIT license. See LICENSE for details.
Review/Translate 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 🙏
