Consider the following:
@propertyWrapper struct UserDefaultsObject<T: Codable> {
let key: String
let defaultValue: T
var wrappedValue: T {
get {
guard let data = UserDefaults.standard.object(forKey: key) as? Data else { return defaultValue }
guard let value = try? JSONDecoder().decode(T.self, from: data) else { return defaultValue }
return value
}
set {
let data = try? JSONEncoder().encode(newValue)
UserDefaults.standard.set(data, forKey: key)
}
}
}
@UserDefaultsObject(key: "date", defaultValue: nil)
static var endDate: Date?
When I try this:
let now = Date()
endDate = now
I get the error: "Top-level Optional encoded as number JSON fragment."
But if I try this in Playground it succeed. I am doing something wrong ?
let now: Date? = Date()
let data = try? JSONEncoder().encode(now)
if let _ = data {
print("success")
} else {
print("failure")
}