DefaultsKit
Simple, Strongly Typed UserDefaults for iOS, macOS and tvOS
Install / Use
/learn @nmdias/DefaultsKitREADME

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 <<
Usage
Instantiate, or get a shared instance of Defaults
let defaults = Defaults() // or Defaults.shared
Then:
// 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 😃
Check if a key has a value:
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.
Implicit Member Expression
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 key
Complex objects
To 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 // 80
Nested Objects
You 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 // cat
License
DefaultsKit is released under the MIT license. See LICENSE for details.
Help Wanted
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 🙏
Related Skills
node-connect
351.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
