Изменения в новых версиях / Swift 5.1

// *** 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