Skip to content

Instantly share code, notes, and snippets.

@reyandrey
Created March 22, 2020 05:49
Show Gist options
  • Save reyandrey/09515974376dabb896b9d431ea73acdd to your computer and use it in GitHub Desktop.
Save reyandrey/09515974376dabb896b9d431ea73acdd to your computer and use it in GitHub Desktop.
UserDefaults property wrapper example
import UIKit
import Foundation
/// Обертка, которая позволи хранить переменные сразу в UserDefaults
@propertyWrapper public struct UserDefaultsStandart<T> {
/// Ключи
public enum Key: String {
case foo
case bar
}
/// Ключ для хранения в UserDefaults
private let key: Key
/// Значение по умолчанию
private let defaultValue: T
/// Инициализатор должен быть объявлен публичным, для доступа к нему в других модулях
/// - Parameters:
/// - key: Ключ для хранения в UserDefaults
/// - defaultValue: Значение по умолчанию, если по данному ключу ничего нет
init(key: UserDefaultsStandart.Key, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
/// Процесс обертывания переменной, через переопределения геттера и сеттера
public var wrappedValue: T {
get { return UserDefaults.standard.object(forKey: key.rawValue) as? T ?? defaultValue }
set { UserDefaults.standard.set(newValue, forKey: key.rawValue) }
}
}
// Пример
public struct UserSettings {
@UserDefaultsStandart(key: .foo, defaultValue: true)
public static var someBoolValue: Bool
@UserDefaultsStandart(key: .bar, defaultValue: "")
public static var someString: String
}
print("UserSettings.someBoolValue = \(UserSettings.someBoolValue)")
print("UserSettings.someString = \(UserSettings.someString)")
UserSettings.someBoolValue = false
UserSettings.someString = UUID().uuidString
print("UserSettings.someBoolValue = \(UserSettings.someBoolValue)")
print("UserSettings.someString = \(UserSettings.someString)")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment