// *** before: ***
struct SettingsOld {
var username: String {
get { UserDefaults.standard.string(forKey: "username") ?? "" }
set { UserDefaults.standard.set(newValue, forKey: "username") }
}
var theme: String {
get { UserDefaults.standard.string(forKey: "theme") ?? "dark" }
set { UserDefaults.standard.set(newValue, forKey: "theme") }
}
// the same six lines for every single key
}
// *** in version 5.1: ***
@propertyWrapper
struct Stored {
let key: String
let initial: String
var wrappedValue: String {
get { UserDefaults.standard.string(forKey: key) ?? initial }
set { UserDefaults.standard.set(newValue, forKey: key) }
}
}
struct Settings {
@Stored(key: "username", initial: "") var username: String
@Stored(key: "theme", initial: "dark") var theme: String
}
// @State, @Published and @AppStorage are exactly this and nothing more