Skip to content

Instantly share code, notes, and snippets.

@seanwoodward
Created March 28, 2022 15:41
Show Gist options
  • Save seanwoodward/e6cd71212be69ca1ba353bb3b41b701f to your computer and use it in GitHub Desktop.
Save seanwoodward/e6cd71212be69ca1ba353bb3b41b701f to your computer and use it in GitHub Desktop.
Extend AppStorage property wrapper to use typed keys instead of strings
import SwiftUI
extension AppStorage {
public struct Key {
let name: String
}
}
extension AppStorage {
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Bool {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Int {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Double {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == String {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == URL {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Data {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value: RawRepresentable, Value.RawValue == Int {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
public init(wrappedValue: Value, _ key: AppStorage.Key, store: UserDefaults? = nil) where Value: RawRepresentable, Value.RawValue == String {
self.init(wrappedValue: wrappedValue, key.name, store: store)
}
}
extension AppStorage where Value: ExpressibleByNilLiteral {
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Bool? {
self.init(key.name, store: store)
}
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Int? {
self.init(key.name, store: store)
}
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Double? {
self.init(key.name, store: store)
}
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == String? {
self.init(key.name, store: store)
}
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == URL? {
self.init(key.name, store: store)
}
public init(_ key: AppStorage.Key, store: UserDefaults? = nil) where Value == Data? {
self.init(key.name, store: store)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment