Skip to content

Instantly share code, notes, and snippets.

@yaslab
Last active January 8, 2024 15:00
Show Gist options
  • Save yaslab/b3829f02474335202eb8ee3ca74a8e16 to your computer and use it in GitHub Desktop.
Save yaslab/b3829f02474335202eb8ee3ca74a8e16 to your computer and use it in GitHub Desktop.
import Foundation
extension UserDefaults {
struct Key<Value> {
let name: String
init(_ name: String) {
self.name = name
}
}
subscript<V: Codable>(key: Key<V>) -> V? {
get {
guard let data = self.data(forKey: key.name) else {
return nil
}
return try? JSONDecoder().decode(V.self, from: data)
}
set {
guard let value = newValue, let data = try? JSONEncoder().encode(value) else {
self.set(nil, forKey: key.name)
return
}
self.set(data, forKey: key.name)
}
}
subscript(key: Key<URL>) -> URL? {
get { return self.url(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<String>) -> String? {
get { return self.string(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<Data>) -> Data? {
get { return self.data(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<Bool>) -> Bool {
get { return self.bool(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<Int>) -> Int {
get { return self.integer(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<Float>) -> Float {
get { return self.float(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
subscript(key: Key<Double>) -> Double {
get { return self.double(forKey: key.name) }
set { self.set(newValue, forKey: key.name) }
}
}
// -----------------------------------------------------------------------------
// TEST
struct Person: Codable {
var name: String
var age: Int
}
extension UserDefaults.Key {
typealias Key = UserDefaults.Key
//static let test = Key<Bool>("aaaa")
static var test: Key<Bool> { return Key<Bool>("test") }
static var array: Key<[Person]> { return Key<[Person]>("array") }
}
UserDefaults.standard[.test] = true
let test = UserDefaults.standard[.test]
print(test) // true
UserDefaults.standard[.array] = [
Person(name: "Taro", age: 10),
Person(name: "Jiro", age: 8)
]
let array = UserDefaults.standard[.array]
print(array!) // [Person(name: "Taro", age: 10), Person(name: "Jiro", age: 8)]
@SaurabhSharma10890
Copy link

How to delete using same key type?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment