UserDefaults Property Wrapper
Property wrappers for type-safe UserDefaults access with Codable support.
@propertyWrapper
struct UserDefault<Value> {
let key: String
let defaultValue: Value
let container: UserDefaults = .standard
var wrappedValue: Value {
get { container.object(forKey: key) as? Value ?? defaultValue }
set { container.set(newValue, forKey: key) }
}
}
/// Codable-compatible UserDefaults wrapper
@propertyWrapper
struct CodableUserDefault<Value: Codable> {
let key: String
let defaultValue: Value
let container: UserDefaults = .standard
var wrappedValue: Value {
get {
guard let data = container.data(forKey: key),
let value = try? JSONDecoder().decode(Value.self, from: data) else {
return defaultValue
}
return value
}
set {
if let data = try? JSONEncoder().encode(newValue) {
container.set(data, forKey: key)
}
}
}
}
// Usage:
enum AppSettings {
@UserDefault(key: "hasCompletedOnboarding", defaultValue: false)
static var hasCompletedOnboarding: Bool
@CodableUserDefault(key: "recentSearches", defaultValue: [])
static var recentSearches: [String]
}